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引擎。所以上面的代碼將做到這一點。