2012-01-31 102 views
1

我有一些JavaScript这样的:javascript函数范围和覆盖

<script> 

var num = 0; 

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

</script> 

于是,在后来的页面我有:

<script>lol();</script> 

如何确保第一函数并不总是被else语句中的第二个覆盖?

感谢

+0

您有条件。因此,该脚本只定义了一个函数,即第一个函数或另一个函数。最终,这取决于条件。在你的情况下,每次运行这个脚本时都会运行alert alert。 – Anthony 2012-01-31 12:12:32

+0

许多伟大的答案,但我将奖励'回答'徽章的人先回答并坚持格式,我需要遵守:)再次感谢 – Tim 2012-01-31 12:37:20

+0

谢谢。探索fyr和jAndy的答案中提到的话题是非常值得的。 – 2012-01-31 12:41:48

回答

0

如何:

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

var num = 0; 

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

</script> 
0

你为什么不重新构造你的代码稍微:

<script> 

var num = 0;  

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

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

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

myFunction(); 
1

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

一个非常详尽的不同函数声明的比较和深入了解这里提供:http://kangax.github.com/nfe/

它是一个很长的文章,并肯定还需要一定的时间来阅读,但我认为这是更好地为您并且每个人都了解这个问题的根源。从长远来看,它至少可以为您节省大量时间,而不仅仅是复制粘贴代码。

阅读文章后,您会知道为什么它不总是被覆盖。

这里,如果你不喜欢阅读它的代码:

<script> 

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

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

</script> 
+0

为了更好地理解语言,我同意@fyr的观点。总的来说,我推荐Douglas Crockford的“Javascript:The Good Parts”(ISBN:978-0596517748)。除了成为一本好书以外,它也很短! – 2012-01-31 12:25:04

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引擎。所以上面的代码将做到这一点。