一到关于js函数的前端面试题引发的血案

题目如下:

1 f = function() { return true; };
2  g = function() { return false; }; 
3 (function() {
4      if (g() && [] == ![]) { 
5          f = function f() { return false; }; 
6          function g() { return true; }
7      } 
8 })();
9  alert(f()); // true or false ?

 看IE6、IE7、IE8与其它非IE下的不同?

1 var f = function foo(){ 
2      return typeof foo; // "foo" is available in this inner scope 
3  }; // `foo` is never visible "outside" 
4  typeof foo; // "undefined" 
5  f(); // "function" 

除IE6、7、8外,其它浏览器均显示foo为undefined 

这是JScript的bugs,好像IE9的beta2中已经修复了?(尚未安装过,有待证实) 

 

IE中有两个“特性” 

1、函数声明中的标识符允许包含.运算符,例如function window.onload() {} 

2、函数表达式中的标识符可以被函数外部访问 var f = function g(){}; typeof g; // "function"

 

一些相关文章: 

关于JS引擎对var与function预解析 

如何理解表达式中的具名函数

函数声明与函数表达式》 

命名函数表达式探秘

具名函数表达式

看完这些资料,做这道题应该就很简单了吧?

 

在IE6、7、8下面,代码等价于:

 1 f = function() { return true; };
 2 g = function() { return false; };
 3 (function() {
 4     var f, g;
 5      g = function() {return true;}
 6      f = function() {return false;}
 7     if (g()) {
 8         f = f;
 9     }
10 })();
11 alert(f());

在FF下的代码等价于:

1 f = function() { return true; };
2 g = function() { return false; };
3 (function() {
4     if (g()) {
5         /**..*/
6     }
7 })();
8 alert(f());

在Chrome下等价于:

 1 f = function() { return true; };
 2 g = function() { return false; };
 3 (function() {
 4     var g;
 5     function g() {
 6         return true;
 7     }
 8     if (g()) {  
 9        f = function f() {
10             return false;
11        }
12     }
13 })();
14 alert(f()); 
posted @ 2012-06-08 15:24  无赖君子  阅读(433)  评论(0编辑  收藏  举报