日期:2014-05-16  浏览次数:20371 次

关于一个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,  
.....