第二段代码中的if(false)
实际上不是根本不会执行的么?为啥阮老师还说执行的结果会是'I am inside!'
呢? 很是奇怪,我自己也把这段代码写到文件中测试了,会报f is not a function
的错误。
第二段代码中的if(false)
实际上不是根本不会执行的么?为啥阮老师还说执行的结果会是'I am inside!'
呢? 很是奇怪,我自己也把这段代码写到文件中测试了,会报f is not a function
的错误。
因为 JavaScript 会先处理函数定义,再执行代码。
所以 JavaScript 解释器一开始看到你定义了一个 f 函数,然后又定义了一个 f 函数。然后没了。JavaScript 记住了后定义的那个 f 函数。
然后它开始执行。跳过定义,发现一匿名函数表达式,求值之。继续,刚刚的匿名函数被调用了。调用之。对 if 语句内的表达式进行求值。求值结果为假,跳过 if 后边的语句块。调用 f 函数,找到了。然后开始执行 f 函数体。
es5是没有块级作用域的,所以
if(false){function aa(){}}
解析后是这样的
`function aa;
if(false){function aa(){}}
`
变量提升,一旦进入一个函数,所有出现的局部变量都会声明好,即使它的声明语句还没执行,对f来说,它就是个新的局部f,刚刚进入函数时值为undefined(已经shadow了外部的f),因为分支未执行,所以它的赋值语句没有执行,还是一个undefined,这时你调用它就会报错啦,就是因为这个变量提升,才有主张,在函数开头就申明所有用到的变量,提醒自己这些变量尽管还没有赋值但是已经可见啦
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
说了是在 ES5 的环境中运行,你可以找个旧的 IE8 之类的,
ES 5 里所有作用域是以函数为界,而
function f
这种声明为提前解析,比如你可以写因为函数提前的问题,这里f解析就会到一个作用域的最前面,不管它是不是false
可以看看这个: http://www.bootcss.com/articl...