繁体   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