一道精妙的题目及解答:
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 ?
请先思考。。。。。
答案很多。
(1) firefox 下 输出true
参考资料 :https://developer.mozilla.org/en/JavaScript/Guide/Functions
文章指出:
A function can be defined based on a condition. For example, given the following function definition:
view plainprint?
if (num == 0){
function myFunc(theObject) {
theObject.make = "Toyota"
}
}
the myFunc function is only defined if the variable num equals 0. If num does not equal 0, the function is not defined, and any attempt to execute it will fail.
所以在if这关就过不去。所以直接返回true
(2)chrome 输出 false
在chrome 以及IE 9中是脚本引擎是符合ECMA 之规范,所以脚本 function g()
在 匿名函数体中有预解析(可查看浅谈JavaScript 的运行机理)
(3)IE 6,7,8 输出false
到跟chrome不同,其中IE 6,7,8 中错误的将 f = function f() 也在匿名函数中预解析至顶部声明。
很不是很明了了?
对了if 中也埋藏了机关:
1.运算符优先级
2. 类型转换;
3.== 与 === 的区别
因为![] 为false ,于是会将[] 转换成字符串"" ,在== 不检查类型的情况下,非严格的将空字符串与false 匹配上。
所以会有([] == ![] ) 为 true
在JS 手册中关于 ‘==’ 有 原文: “如果两表达式的类型不同,则试图将它们转换为字符串、数字或 Boolean 量。”
posted on 2010-10-11 03:48
-274°C 阅读(300)
评论(0) 编辑 收藏 所属分类:
web前端