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

为什么在JavaScript中闭包比全局变量更安全?,javascript,scope,closures,Javascript,Scope,Closures,我对编程相当陌生,但还不能理解一些基本概念 我在读这篇文章时,从另一个w3schools页面重定向到这里,告诉我“避免全局变量” 然而,我真的不明白闭包是如何打败全局的 从我的所见所闻来看,全局变量是危险的,因为任何脚本或用户都可以修改它们,这可能会破坏代码功能 无论如何,如果我们考虑链接中的代码: var add = (function () { var counter = 0; return function () {return counter += 1;} })(); 如果我们考虑全局

我对编程相当陌生,但还不能理解一些基本概念

我在读这篇文章时,从另一个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函数之外的代码无法触及计数器。它们可以单独创建一个计数器变量,但它与add使用的计数器不同,不会影响add的操作

在第二种情况下,任何接触全局计数器的代码都会影响add的操作。

在第一种情况下,add函数之外的代码不能接触计数器。它们可以单独创建一个计数器变量,但它与add使用的计数器不同,不会影响add的操作


在第二种情况下,任何触及全局计数器的代码都会影响add的操作。

您可能缺少的是第一个add函数会立即执行。这由声明后面的括号表示。例如:

var something = function(){}();
由于此立即执行返回一个函数,因此add变量现在表示返回的函数,计数器变量设置为0,这也包括在立即执行的函数中

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


add调用现在使用add中声明的计数器变量运行该内部函数,现在除了该内部函数外,不能再由任何其他函数操作。

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

var something = function(){}();
由于此立即执行返回一个函数,因此add变量现在表示返回的函数,计数器变量设置为0,这也包括在立即执行的函数中

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

add调用现在使用add中声明的计数器变量运行该内部函数,并且现在除了该内部函数之外,不能再由任何操作