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

Why are closures safer than global variables in JavaScript?

我是编程新手,但无法理解一些基本概念。

我正在阅读这篇文章 http://www.w3schools.com/js/js_function_closures.asp(我从另一个 w3schools 页面重定向到 'avoid global variables')。

但是,我真的无法理解闭包 "beat" 全局变量是如何实现的。

据我所知,全局变量是危险的,因为任何脚本或用户都可以修改它们,这可能会破坏代码功能。

无论如何-如果我们考虑来自link的代码:

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

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

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

调用 add 现在 运行 该内部函数,使用在 add 中声明的计数器变量,现在只能由该内部函数操作。