2013-01-05 28 views
1

我閱讀了大量的帖子,並且詢問/回答了有關javascript匿名自執行函數的問題,但是我擔心我仍然錯過了這一點。爲什麼這段代碼顯示myvar值?不應該構造(函數(){代碼})()保持所有變量從外部不可見?javascript自動執行函數和範圍確定

(function(){ 
    myvar = 5; 
})(); 

alert(myvar); 

有啥愨上面的代碼和區別

function myfunction(){ 
    myvar = 5; 
}; 
myfunction(); 

alert(myvar); 

+5

局部變量應該用var關鍵字來定義。 – VisioN

回答

2

變量在JavaScript中函數級別範圍的。這意味着如果你在一個循環或一個if語句中聲明瞭一個變量,它將會被整個函數所使用。

就你的情況而言,你的myVar可以在有人指出的整個窗口中使用。

如果您需要明確地籠的功能範圍內您的變量,創建一個匿名函數,然後執行它馬上和所有的變量內將範圍限定爲功能

(function(){ 
    var myvar = 5; 
})(); 


alert(typeof(myVar)); 

結果「未定義」

+0

所以構造函數(){})()與變量範圍無關......? – lelloman

+0

@ user1846340它的確如此,但只有'function foo(){}; foo();'確實。立即調用的函數遵循與其他函數完全相同的範圍規則。 – apsillers

+0

@ user1846340它確實有。它創造了一個新的範圍。你只需要使用範圍。 –

3

myvar在窗口範圍內定義,因此它是所有人都可以訪問的。

你應該範圍,如果你想保持私人的,varmyvar

(function(){ 
    var myvar = 5; 
})(); 
+0

那麼應該如何使用self.executing構造? – lelloman

+3

@ user1846340你稱之爲「自我執行功能」更準確地稱爲[立即調用函數表達式](http://benalman.com/news/2010/11/immediately-invoked-function-expression/),或者IIFE。 「自動執行」表明某種類型的遞歸,其中該函數重複地自我調用。 – apsillers

+0

感謝您的鏈接,非常intresting – lelloman

2

你沒有申報 「MYVAR」 與var

看看會發生什麼,當你改變這樣的:

(function(){ 
    "use strict"; 
    myvar = 5; 
})(); 
+0

會發生什麼? :) – VisioN

+0

我知道我可以用var聲明它,但我想了解自執行函數的用法。使用嚴格模式警報沒有看到myvar – lelloman

+0

@ user1846340問題是,如果你**不**用'var'聲明它是**全局變量**。 – Pointy