[英]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.