关于一个JS闭包面试题目的疑问
今天在网上看到一个javascript的面试题,如下:
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 ?
解释答案是:
(function() {
if (g() && [] == ![]) {
//应该看成if((g() && [] )== ![])
//因为g()是false后面那个&&[]就没起作用 整个都是false
//![]也是false 所以if成立 进入if块内
f = function f() {return false;};
//重新定义f
function g() {return true;}
//这句没用
}
})();
alert(f());
//false
源文档位于http://t240178168.iteye.com/blog/1633344
===================================================
最终答案确实是false,但是我拿这段代码调试了一下,却发现解释不怎么对,if语句中的g()返回不是false,而是true,if语句里面定义的函数g()这句不是没用,而是确实被调用了,这是为什么呢,求高手解释。
[cj205]楼下的答案是何等的扯淡,在此我必须要纠正下其中的错误,未免对查到此贴的人产生影响。
首先==的优先级是高于&&的 那么楼下的那个表达式分解就是扯淡的很。
其次,本题中的几个问题分别涉及到如下3个知识点
1.数组也是对象
2.function A()属于函数声明,会在javascript具体执行前作过一轮扫描。
3.非相同类型的值进行等值比较时,是要做类型转换的。------解决方案--------------------是的他的解释答案 有问题
(function() {
if (g() && [] == ![]) {
f = function f() {return false;};
function g() {return true;} //函数声明,是预先解析
}
})();
//g() 是以函数内声明的那个,return true
(g() && []) 得 [] 并不是 true , ![] 得 false
[]==false 得 true,
.....