扫码关注官方订阅号
foo(); if (true) { function foo() { console.log(1); } } else { function foo() { console.log(2) } }
在chrome下是显示typeError,在safari下输出2
人生最曼妙的风景,竟是内心的淡定与从容!
条件语句中声明函数是不合法的 非标准 所以有些浏览器可以
var foo; if (true) { foo = function () { console.log(1); } } else { foo = function () { console.log(2) } } foo()
可以写成这样
js解释器在进入一层作用域时,会进行函数提升和变量提升,对于以function a(){}形式声明的函数,即使在最后一行声明,解释器也会先创建函数再从第一行开始执行代码,使得调用可以写在声明之前。而由于js默认没有块级作用域(除了let、const),所以就算你的函数在if for switch while……里面被声明,理论上,由于函数提升的原因,这些函数都会被提升到这层作用域开始处声明。理论上函数提升才不管你代码逻辑,只在乎函数声明在代码中的先后顺序。不过chrome还就真管你代码逻辑了,你只能在if else下面调用函数,而你的Safari它就简单的按照先后顺序声明重复声明foo函数。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
条件语句中声明函数是不合法的 非标准 所以有些浏览器可以
可以写成这样
js解释器在进入一层作用域时,会进行函数提升和变量提升,对于以function a(){}形式声明的函数,即使在最后一行声明,解释器也会先创建函数再从第一行开始执行代码,使得调用可以写在声明之前。
而由于js默认没有块级作用域(除了let、const),所以就算你的函数在if for switch while……里面被声明,理论上,由于函数提升的原因,这些函数都会被提升到这层作用域开始处声明。
理论上函数提升才不管你代码逻辑,只在乎函数声明在代码中的先后顺序。不过chrome还就真管你代码逻辑了,你只能在if else下面调用函数,而你的Safari它就简单的按照先后顺序声明重复声明foo函数。