search

Home  >  Q&A  >  body text

javascript 的函数在执行前被解析是否合理?

因为函数会被提前解析,导致if的条件无效了。

如:

if(test) {
    function a() {
        alert(1);
    }
} else {
    function a() {
        alert(2);
    }
}
a();

无论 test 是 true 还是 false,都会执行 alert(2);

天蓬老师天蓬老师2903 days ago490

reply all(7)I'll reply

  • 阿神

    阿神2017-04-10 14:53:42

    ES5的声明提前特性,在ES6增加块级作用域的概念后会好转一些,可参考阮老师的文章块级作用域一节:http://es6.ruanyifeng.com/#docs/let

    针对这个代码可以这么修改,因为只是声明提前,赋值还是正常的,所以OK:

    var a;
    if(test) {
        a = function() {alert(1)}
    } else {
        a = function() {alert(2)}
    }
    a();
    

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:53:42

    請不要混淆函數聲明與函數表達式。

    if(test) {
        function a() {
            alert(1);
        }
    } else {
        function a() {
            alert(2);
        }
    }
    a();
    

    等價於

    function a() {
        alert(1);
    }
    function a() {
        alert(2);
    }
    
    if(test) {
    
    } else {
    
    }
    a();
    

    這是 js 的性質,沒有什麼合不合理性可言。存在即合乎理性,合乎理性即存在。

    但是否合乎情理就值得商榷了。考慮到這種寫法的誤導性並且本身沒什麼意義,ES6 發生了改變。不過一直用嚴格模式的路過~

    reply
    0
  • 黄舟

    黄舟2017-04-10 14:53:42

    javascript 中没有块级作用域,只有函数作用域。
    在作用域中的函数定义都会被提升

    reply
    0
  • 迷茫

    迷茫2017-04-10 14:53:42

    看这里 看这里 看这里 http://segmentfault.com/blog/liangyi/1190000000692129

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:53:42

    为什么不合理呢,在其他语言中函数的声明就必须是提前的,比如c,都是不允许嵌套函数的

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 14:53:42

    无所谓合理不合理。熟悉规则,遵守规则就好。

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 14:53:42

    首先,这是JS的声明提前的规则,除函数可以作为作用域外,不存在块级作用域。

    reply
    0
  • Cancelreply