87,907
社区成员
发帖
与我相关
我的任务
分享
f = function() {return true;};
g = function() {return false;};
(function() {
if (g() && [] == ![]) {
f = function f() {return false;};
function g() {return true;}
}
})();
alert(f()); // true or false ?
f = function() {return true;};
g = function() {return false;};
(function() {
if (g() && [] == ![]) {
alert('hi');
f = function f() {return false;};
//function g() {return true;}
var g = function() {
return true;
};
}
})();
alert(f());
如果改成这样就出错,说明函数定义方式是先加载的
(function() {
if (g() && [] == ![]) {
f = function f() {return false;};
function g() {return true;}
}
})();
真正执行时相当于
(function() {
function g() {return true;}
if (g() && [] == ![]) {
f = function f() {return false;};
}
})();
所以if里面的"g()"相当于true;
3.而(true && [])的结果是[],对!你没看错不是false或true而是空数组“[]”(参见javascript“&&” “||”另类使用技巧);
4.然后([] == ![])的值部分,没使用“==”对比是会自动类型转换的,所以“[]”被转换成“false”了,
([] == ![])就返回true啦!
如果使用“===”就绝壁不会这样啦!(话有说回来实际开发中谁会那么操蛋拿[]去和![]比较?)
5.if(true)后就是“ f = function f() {return false;}; ”就这样全局变量f在这个被称作“匿名包裹函数”的函数中被改变啦。