2011-04-30 172 views
4

以下片段是否完全相同?如果沒有什麼尊重?JavaScript塊範圍與功能

var x = (function() { 
    ... //a 
    return function(){ 
     ... //b 
    }; 
})(); 

var x; 
{ 
    ... //a 
    x = function(){ 
     ... //b 
    }; 
} 
+0

@JohnS代碼,請不要粘貼到標題這樣。將您的代碼發佈到正文中。 – JohnP 2011-04-30 11:23:43

+0

@JohnP你說的對,但是你的標題太籠統了,就像「我的代碼有什麼問題?」 – 2011-04-30 11:24:43

+0

@JohnS但這就是你問的。將代碼粘貼到標題中並不能使其可讀。隨時爲您的問題提出一個更好的問題陳述 – JohnP 2011-04-30 11:25:46

回答

6

有一個主要區別:在JavaScript中,塊不會引發新的變量範圍。因此,您不能在// a代碼塊中定義私有變量。比較

var x = (function() { 
    var v = 42; 
    return function(){ 
     return v; 
    }; 
})(); 
// v; would yield ReferenceError: v is not defined, so you need to call x 

var x; 
{ 
    var v = 42; 
    x = function(){ 
     return v; 
    }; 
} 
// v is 42 here, that's not what's intended. 
0

一個主要的區別是,在執行...//a時,X不存在。現在在你的情況下,在這兩種情況下,它是undefined,但通常來說,可能在...//a期間訪問x變量,而在第一種情況下不可以。

否則在你的情況下它是相同的。畢竟在你的情況下,代碼基本上被重構爲一個單獨的函數,就像任何其他語言一樣。

+2

還有一件事:'{var z = 1;}'將在窗口命名空間中創建一個變量z,而'(function(){var z = 2;}()) '不會污染全局名稱空間。這就是爲什麼功能選項是首選 – 2011-04-30 11:28:31