2015-08-29 62 views
1

我很新的編程,但不能理解一些基本概念。 (我從另一個w3schools頁面重定向到告訴我'避免全局變量')。爲什麼閉包比JavaScript中的全局變量更安全?

但是,我真的不明白如何關閉「擊敗」全局。

從我所看到和閱讀的內容來看,全局變量是危險的,因爲任何腳本或用戶都可以修改它們,可能會破壞代碼功能。

Anyway-如果我們考慮代碼的鏈接:

var add = (function() { 
var counter = 0; 
return function() {return counter += 1;} 
})(); 

如果我們考慮到全局變量:

var counter = 0; 
function add(){ 
counter = counter+1; 
return counter; 
} 

如何是第一種情況少用腳本比第二訪問?這兩種情況下都不需要一行代碼來更改變量嗎?即來到我的腦海裏的唯一的事情是在它被執行另一個函數聲明關閉,因此它成爲唯一的本地訪問:

function exec(){ 

var add = (function() { 
var counter = 0; 
return function() {return counter += 1;} 
})(); 

console.log(add()); 
} 

但我不認爲這會做的工作。

回答

4

在第一種情況下,代碼add功能不能觸摸計數器。他們可以單獨創建一個counter變量,但它與add使用的計數器不同,並且不會影響add的操作。

在第二種情況下,任何觸及全球counter的代碼都將能夠影響add的操作。

2

您可能會丟失的是第一個添加函數被立即執行。這由其聲明後的括號表示。例如:

var something = function(){}(); 

由於這種立即執行返回函數,附加變量現在表示返回的函數設置爲0,計數器的變量(其也包括在立即執行功能)。

因爲它是在一個函數中聲明的,所以該計數器變量現在只對該函數可見,並且因此被保護以防被程序中稍後聲明的任何其他計數器變量覆蓋。

現在添加的調用運行內部函數,使用在add中聲明的計數器變量,現在不能再由除內部函數以外的任何操作。