扫码关注官方订阅号
第二段代码中的if(false)实际上不是根本不会执行的么?为啥阮老师还说执行的结果会是'I am inside!'呢? 很是奇怪,我自己也把这段代码写到文件中测试了,会报f is not a function的错误。
if(false)
'I am inside!'
f is not a function
认证高级PHP讲师
说了是在 ES5 的环境中运行,你可以找个旧的 IE8 之类的,ES 5 里所有作用域是以函数为界,而 function f 这种声明为提前解析,比如你可以写
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,这时你调用它就会报错啦,就是因为这个变量提升,才有主张,在函数开头就申明所有用到的变量,提醒自己这些变量尽管还没有赋值但是已经可见啦
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
说了是在 ES5 的环境中运行,你可以找个旧的 IE8 之类的,
ES 5 里所有作用域是以函数为界,而
function f这种声明为提前解析,比如你可以写因为函数提前的问题,这里f解析就会到一个作用域的最前面,不管它是不是false
可以看看这个: http://www.bootcss.com/articl...
因为 JavaScript 会先处理函数定义,再执行代码。
所以 JavaScript 解释器一开始看到你定义了一个 f 函数,然后又定义了一个 f 函数。然后没了。JavaScript 记住了后定义的那个 f 函数。
然后它开始执行。跳过定义,发现一匿名函数表达式,求值之。继续,刚刚的匿名函数被调用了。调用之。对 if 语句内的表达式进行求值。求值结果为假,跳过 if 后边的语句块。调用 f 函数,找到了。然后开始执行 f 函数体。
es5是没有块级作用域的,所以
文中说了,es5的环境下会出现声明提升的问题。
就是在js一开始执行函数的时候,会把变量和函数声明先执行好,然后再开始执行函数。
变量提升,一旦进入一个函数,所有出现的局部变量都会声明好,即使它的声明语句还没执行,对f来说,它就是个新的局部f,刚刚进入函数时值为undefined(已经shadow了外部的f),因为分支未执行,所以它的赋值语句没有执行,还是一个undefined,这时你调用它就会报错啦,就是因为这个变量提升,才有主张,在函数开头就申明所有用到的变量,提醒自己这些变量尽管还没有赋值但是已经可见啦