javascript - 阮一峰老师《ECMAScript 6入门》第一节中的疑问
PHP中文网
PHP中文网 2017-04-11 09:19:19
[JavaScript讨论组]

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

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(5)
阿神

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

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

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

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

ringa_lee

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

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

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

伊谢尔伦

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

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

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

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

黄舟

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号