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