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

图片描述

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

阅读 4k
5 个回答

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

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

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

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

因为 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,这时你调用它就会报错啦,就是因为这个变量提升,才有主张,在函数开头就申明所有用到的变量,提醒自己这些变量尽管还没有赋值但是已经可见啦

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题