簡體   English   中英

為什么閉包比JavaScript中的全局變量安全?

[英]Why are closures safer than global variables in JavaScript?

我對編程非常陌生,但無法理解一些基本概念。

我正在閱讀本文http://www.w3schools.com/js/js_function_closures.asp (我從另一個w3schools頁面重定向到那里,告訴我“避免全局變量”)。

但是,我無法真正理解閉包如何“擊敗”全局變量。

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

無論如何-如果我們考慮鏈接中的代碼:

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());
}

但是我認為這不會做。

在第一種情況下, add功能之外的代碼無法觸摸計數器。 他們可以分別創建一個counter變量,但這將是與add使用的計數器不同的變量,並且不會影響add的操作。

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

您可能缺少的是,第一個添加函數將立即執行。 這由聲明后的括號表示。 例如:

var something = function(){}();

因為此立即執行將返回一個函數,所以add變量現在將計數器變量設置為0(也包含在立即執行的函數中)表示該返回的函數。

因為它是在函數中聲明的,所以該計數器變量現在僅對該函數可見,因此可以防止被稍后在程序中聲明的任何其他計數器變量覆蓋。

現在,對add的調用使用在add中聲明的計數器變量運行該內部函數,並且除該內部函數外,現在不再可以對其進行任何操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM