为什么闭包比JavaScript中的全局变量更安全?

时间:2015-08-29 14:36:29

标签: javascript scope closures

我对编程很陌生,但却无法理解一些基本概念。

我正在阅读这篇文章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());
}

但我认为这不会起作用。

2 个答案:

答案 0 :(得分:5)

在第一种情况下,代码外部 counter功能无法触及计数器。他们可以单独创建add变量,但它与add使用的计数器不同,并且不会影响counter的操作。

在第二种情况下,触及全局add的任何代码都可以影响BitVoicerSerial bitVoicer = BitVoicerSerial(0); 的操作。

答案 1 :(得分:3)

您可能缺少的是第一个添加功能立即执行。这由其声明后面的括号表示。例如:

var something = function(){}();

因为这个立即执行返回一个函数,add变量现在表示返回的函数,其中计数器变量设置为0(它也包含在立即执行的函数中)。

因为它是在一个函数中声明的,所以该计数器变量现在只对该函数可见,因此不会被程序中稍后声明的任何其他计数器变量覆盖。

对add的调用现在运行内部函数,使用在add中声明的计数器变量,现在除了内部函数之外的任何东西都不能再操作了。