阮一峰老师《ECMAScript 6入门》第一节中的疑问


第二段代码中的if(false)实际上不是根本不会执行的么?为啥阮老师还说执行的结果会是'I am inside!'呢? 很是奇怪,我自己也把这段代码写到文件中测试了,会报f is not a function的错误。


变量提升,一旦进入一个函数,所有出现的局部变量都会声明好,即使它的声明语句还没执行,对f来说,它就是个新的局部f,刚刚进入函数时值为undefined(已经shadow了外部的f),因为分支未执行,所以它的赋值语句没有执行,还是一个undefined,这时你调用它就会报错啦,就是因为这个变量提升,才有主张,在函数开头就申明所有用到的变量,提醒自己这些变量尽管还没有赋值但是已经可见啦


因为 JavaScript 会先处理函数定义,再执行代码。

所以 JavaScript 解释器一开始看到你定义了一个 f 函数,然后又定义了一个 f 函数。然后没了。JavaScript 记住了后定义的那个 f 函数。

然后它开始执行。跳过定义,发现一匿名函数表达式,求值之。继续,刚刚的匿名函数被调用了。调用之。对 if 语句内的表达式进行求值。求值结果为假,跳过 if 后边的语句块。调用 f 函数,找到了。然后开始执行 f 函数体。


文中说了,es5的环境下会出现声明提升的问题。

就是在js一开始执行函数的时候,会把变量和函数声明先执行好,然后再开始执行函数。


es5是没有块级作用域的,所以

if(false){function aa(){}}    
解析后是这样的
`function aa;
if(false){function aa(){}} 
`

说了是在 ES5 的环境中运行,你可以找个旧的 IE8 之类的,
ES 5 里所有作用域是以函数为界,而 function f 这种声明为提前解析,比如你可以写

f();// 在这里可以调用f 并不会报错
function f() {
}

因为函数提前的问题,这里f解析就会到一个作用域的最前面,不管它是不是false

可以看看这个: http://www.bootcss.com/articl...



相关阅读:
定时器中this为什么会指向window
backbone排序问题,视图实时排序
vuex中的state值,在工具类模块中怎么获取?
怎样用yii2.0配合mongodb做后台的权限控制系统???
类方法里实现网络请求类单例的方法有些情况返回不了数据
mysql如何合并两张结构相同的数据表?
easyui1.5 datagrid中分页显示不正常,求教各位
API Gateway 或者 OpenAPI设计思想?
vue.js实现组件间的上移下移
新人小白问题之 什么时候需要用到form标签?什么时候不必用,用不用有什么区别?
Git出错 Fatal:multiple Stage Entriesfor Merged File
前端怎么实现关闭页面或浏览器后,重新打开页面或重启浏览器,可以继续原来的操作,比如重新打开后不需要重新调用后台的服务
flask 中的 template_rendered 函数
react map函数中点击事件失效
怎么检查一个checkbox是否存在?
为什么onmouseenter函数里面的i值为13?
iOS NSPredicate 过滤排序
有没有jenkins实现PHP工程的持续集成解决方案
怎么样阻止默认事件的出发(即验证不通过无法滑动?) 求大神!
mongoose 无法存储



快速导航

Copyright © 2016 phpStudy |