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

废话少说,直接上题:

        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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值