2012-08-08 82 views
3

我明白var關鍵字意味着裏面的功能,但現在我想明白了什麼是外功能var關鍵字的目的。我做了一些測試(見下文),它沒有區別。那麼,如果你把var關鍵字放在函數外面,它會有什麼區別呢?的javascript使用var關鍵字函數外

1.

example = 1; 
function test(){ 
    var example = 2; 
} 
test(); 
alert(example); //alert 1 no matter if example=1 or var example=1 before function 

2.

example = 1; 
function test(){ 
    example = 2; 
} 
test(); 
alert(example); //alert 2 no matter if example=1 or var example=1 before function 

3.

var example = 1; 
function test(){ 
    alert(example); 
} 
test(); //always alert 1, no matter if var example=1 or example=1 before function 
+0

可能重複(http://stackoverflow.com/questions/1470488/difference-between-using-var-and-not-using-var- in-javascript)(第一句)。 – 2012-08-08 17:09:30

+0

要特別注意(當前第二個)在該重複問題上的答案 - http://stackoverflow.com/a/1471738/211070 – Tom 2012-08-08 17:14:53

回答

1

關鍵字var聲明在當前範圍(可變孔,在技術上在相同的封閉件,但讓我們現在保持簡單)

因爲兩個你的函數(試驗)和你的變量(例如)在「全球」範圍內被宣佈他們都有獲得對方的意思功能test可以訪問變量example

在你的第一個例子中,你已經聲明一個名爲example的新var,這意味着現在當你調用var示例(在方法內部)時,它會引用這個變量。

0

沒有在全球空間中的真正的區別,只要你嚴格模式不是。

這就是說,你還是應該使用var作爲良好的編程習慣。自動定義的變量是邪惡的。

0

我相信,如果你把一個VAR它只能在函數中使用單獨像PHP函數內IF語句在那裏,如果你把一個VAR outwith的函數,那麼它可以在一個以上的功能使用 - 像一個在該頁面範圍內的變量。

0

函數內使用時,因爲它確實他們之外的var - 關鍵字不完全相同的:它結合到當前範圍的新變量。在功能的情況下,範圍是功能。在函數之外使用全局範圍。在瀏覽器中,該全局範圍通常是window-Object。

LG,

FLO

1

是有區別的!

看到這個答案https://stackoverflow.com/a/1471738/211070,但基本上:

由於變量聲明與DontDelete標誌創建屬性,VAR之間X = 1×= 1(當在全局範圍內執行) 是前者的 差和單變量聲明 - 創建DontDelete'able 屬性,而後者不包含。通過變量聲明創建的 - - 因此,物業通過這種隱含分配然後可以從全球 對象中刪除,和前一個創建 不能。

+0

我只是想知道,你曾經在真實世界的場景中使用刪除?在垃圾收集環境中使用它似乎非常不直觀 – 2012-08-08 17:31:54

+0

我不能說我曾經擁有過,但是我不在全局範圍內創建變量。 – Tom 2012-08-08 17:37:41

+0

這似乎是實際回答問題的唯一答案。 – 2015-01-10 01:06:42

0

var關鍵字聲明在當前範圍的變量。沒有它,您將自動在window對象上聲明新屬性,或者訪問並修改更高範圍內的同名變量(如果存在)。在你的例子中,只有全局範圍和內部函數範圍,因此全球範圍內的var example = 1對於你的目的而言在技術上與example = 1相同。但是,如果上述所有代碼都在其他函數作用域內執行,則前2個示例將聲明全局example屬性,而第三個示例將聲明該範圍的局部變量。

0

1)此提醒1的原因是因爲即使你預先調用test()功能,它本身調用和創建自己的封閉,並宣佈它內部的一個獨立var example = 2;。 (所以你的警報不能看到它,它只看到1)。現在如果你這樣做了:return example = 2;你會注意到alert(例子)=== 2.這是因爲你把例子從閉包中取出,並且影響了前面的例子變量。

example = 1; 
function test(){ 
    var example = 2; 
} 
test(); 
alert(example); 

2)在這裏,你不創建函數內一個新的變量,所以它能夠訪問(通過閉合)在其外部的可變示例,並且變成2

example = 1; 
function test(){ 
    example = 2; 
} 
test(); 
alert(example); //alert 2 no matter if example=1 or var example=1 before function 

3)這最後一個是「關閉」如何在這裏工作一個很好的例子。變量,不像我們說function()必須聲明高於東西,試圖訪問它們。另一方面,功能不。因此,雖然var example = 1可能低於function test() { }本身,但並不重要,。重要的是它在CALLtest()之前聲明。這是當閉包被創建時它圍繞任何變量等它可以看到/訪問。 [使用var和在JavaScript中不使用VAR之間的不同]的

// so this ... 
var example = 1; 
function test(){ 
    alert(example); 
} 

// and this work ... 
function test(){ 
    alert(example); 
} 
var example = 1; // <-- notice it's still above the test() func call, it can still see example 
test(); //always alert 1, no matter if var example=1 or example=1 before function 
// if var example = 1; was down here below it, it would alert "undefined", this is because 
// the variable was not available within the scope when test() was called. 
+0

謝謝,但這不是我問的。我寫道,我理解函數內的範圍,問題是關於在函數之前放置var關鍵字,而不是函數內部。因爲就像我寫的那樣,如果在函數聲明之前放置var或不放,結果總是一樣的。 – JohnyFree 2012-08-08 21:49:40

+0

那麼沒有原始的var就會自動被認爲是一個全局變量,因此爲什麼它被使用(比如示例3,只是取出var這個詞) – 2012-08-09 03:40:27

相關問題