javascript函数范围和覆盖

时间:2012-01-31 12:06:46

标签: javascript

我有一些像这样的JavaScript:

<script> 

var num = 0;

 if(num==0){
    function lol(){
        alert("lol");
    }
 } else {
    function lol(){
        alert("haha");
    }
 }

</script>

然后,在我的页面后面:

<script>lol();</script>

如何确保else语句中第二个函数不会被第二个函数覆盖?

由于

6 个答案:

答案 0 :(得分:3)

没有答案在那里提供了对您问题的正确描述。所以我会尽我所能。你遇到的问题是,function declarations(你在那里得到的)是其他一些东西,在javascript运行时解释。此效果通常称为hoisting,这意味着这些函数确实移动到当前上下文的顶部以供脚本执行。

示例,在您的代码段中,会发生以下情况:

<script> 
    var num = 0;

    function lol(){
        alert("lol");
    }

    function lol(){
        alert("haha");
    }

    if(num==0) {

    } else {

    }
</script>

因此,在这个特定实例中的一个简单的解决方案是,不是使用函数声明而是使用function expression。我们可以强制我们的引擎以多种方式创建FE,例如我们可以像

那样分配它
var num = 0,
    lol;

if( num === 0 ) {
    lol = function() {
        alert('lol');
    };
}
else {
    lol = function() {
        alert('haha');
    };
}

函数表达式不会被提升到当前上下文的顶部,因为它不是由js引擎“预先评估”的。所以上面的代码就可以了。

答案 1 :(得分:1)

如果要有条件地定义函数,请使用函数表达式以避免提升行为:

var myFunction = someCondition
                   ? function() {
                       alert('foo');
                      }
                   : function() {
                       alert('bar');
                      };

myFunction();

答案 2 :(得分:1)

这里有其他答案有更多的代码,但我想如果你不知道为什么它不总是被覆盖,你最好的选择是理解问题的根源。

此处提供了对不同函数声明和深入外观的非常详尽的比较:http://kangax.github.com/nfe/

这是一篇很长的文章,肯定会花一些时间阅读,但我认为你和每个人都能更好地理解这个问题的根源。从长远来看,它至少可以节省大量时间,而不仅仅是复制粘贴代码。

阅读完文章后,您将知道为什么它不会一直被覆盖。

如果您不想阅读,请输入以下代码:

<script> 

var num = 0;
var lol = function(){
        alert("haha");
    };

 if(num==0){
    lol = function(){
        alert("lol");
    };
 }

</script>

答案 3 :(得分:0)

<script> 

var num = 0;

 if(num==0){
    var lol = function(){
        alert("lol");
    }
 } else {
    var lol = function(){
        alert("haha");
    }
 }

</script>

答案 4 :(得分:0)

怎么样:

if(num == 0) {
    lol = function() {
        alert("lol");
    };
}
else {
    lol = function() {
         alert("haha");
    };
}

答案 5 :(得分:0)

为什么不稍微重新构建代码:

<script> 

var num = 0;    

function lol(){
    if(num==0){
        alert("lol");
    } else {
        alert("haha");
    }
}
</script>