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

一些javascript面试题(二)函数声明与函数表达式
f = function() {return true;};  
g = function() {return false;};
(function() {  
  if (g() && [] == ![]) {
   f= function f() {return false;};
            function g() {return true;}
      alert(f()); 
      alert(g());
}  
})();
alert(f()); // true or false ? (原面试只有这一个alert,我是为了测试,加了其它三个)
alert(g());


这道题很多人应该都见过,我在网上看到了很多解释,但是感觉总有一些不对,拿出来和大家分享一下。
前三行没什么好说的,第四行里大家要注意一下,函数声明即function g() {return true;} 总是最先执行的,所以在匿名函数内部g()为true,[] == ![]也为true;(具体原因有时间在细说)。

f= function f() {return false;};这句按照EMCAScript规则应该为函数表达式,但ie8会将同时认为为函数声明。
如果是函数声明的话,就会产生两个function f对象,这时 f= function f() {return false;}; 中的f引用指向的是匿名函数内的f声明,即function f() {return false;};
它的变化不会导致外部函数的变化。
所以这时的结果为false,true,true,false;(ie8浏览器)
如果浏览器认定是函数表达式的话,这时就是原有的f = function() {return true;};
重新指向了function() {return false;};,即函数内外的引用是同一个,在匿名函数内部
f发生变化时会同时影响到外部。
所以这时的结果为false,true,false,false;(符合EMCAScript规范的浏览器)