因为函数会被提前解析,导致if的条件无效了。
如:
if(test) {
function a() {
alert(1);
}
} else {
function a() {
alert(2);
}
}
a();
无论 test 是 true 还是 false,都会执行 alert(2);
阿神2017-04-10 14:53:42
ES5的声明提前特性,在ES6增加块级作用域的概念后会好转一些,可参考阮老师的文章块级作用域一节:http://es6.ruanyifeng.com/#docs/let
针对这个代码可以这么修改,因为只是声明提前,赋值还是正常的,所以OK:
var a;
if(test) {
a = function() {alert(1)}
} else {
a = function() {alert(2)}
}
a();
PHP中文网2017-04-10 14:53:42
請不要混淆函數聲明與函數表達式。
if(test) {
function a() {
alert(1);
}
} else {
function a() {
alert(2);
}
}
a();
等價於
function a() {
alert(1);
}
function a() {
alert(2);
}
if(test) {
} else {
}
a();
這是 js 的性質,沒有什麼合不合理性可言。存在即合乎理性,合乎理性即存在。
但是否合乎情理就值得商榷了。考慮到這種寫法的誤導性並且本身沒什麼意義,ES6 發生了改變。不過一直用嚴格模式的路過~