web前端一道很“坑”的js面试题

来源:互联网 发布:编发软件 编辑:程序博客网 时间:2024/05/22 01:52

废话少说,直接上题:

        f = function() {return true;};           g = function() {return false;};           (function() {              if (g() && [] == ![]) {                 f = function f() {return false;};                 function g() {return true;}              }           })();           alert(f()); // ?

这道题之所以坑,是因为网上有不同的答案,婆说婆有理!总体概括为以下三个答案:
答案一:第四行“g()”报错;
答案二:false;
答案三:true;
最后经本人亲自证实发现了这道题最坑的地方,三个答案都是对的,不过在不同的浏览器中!如下:

/**  * edge ie11 chrome(较新版) fireFox(较新版) 第四行g()报错(Uncaught TypeError:g is not a function)  * ie10 ie9 答案为:false  * ie8及以下 答案为:true  */

下面来看看网友们的解释:
答案一:与判断条件无关,js解析器对自调用函数中的函数g进行了预编译但因为在条件中语句还未执行而去提前调用,所以造成报错。
即使写成如下代码也是如此:

        function g() {return false;};           function h() {               console.log(g);//undefined           if (g()) {                   function g() {return true;}              }           }           h();        //edge ie11 chrome(较新版) fireFox(较新版) 第四行g()报错(Uncaught TypeError:g is not a function)

答案二:

(function() {        if (g() && [] == ![]) {     //应该看成if((g() && [] )== ![])   //因为g()是false后面那个&&[]就没起作用 整个都是false    //![]也是false 所以if成立 进入if块内         f = function f() {return false;};     //重新定义f          function g() {return true;}     //这句没用      }     })();    alert(f());   //false  

答案三:

        f = function() {return true;};           g = function() {return false;};           (function() {            //g() 返回false,==优先级高于&&,&&后直接忽略,条件判断不成立。              if (g() && [] == ![]) {                 f = function f() {return false;};                 function g() {return true;}              }           })();           alert(f()); // true

简直巨坑,貌似都很有道理!
在下不才,将造成这个问题的原因归咎为不同浏览器的js引擎对函数声明顺序的解析不同,如有更深见解,还请大神不吝赐教。

0 0