我对编程很陌生,但却无法理解一些基本概念。
我正在阅读这篇文章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());
}
但我认为这不会起作用。
答案 0 :(得分:5)
在第一种情况下,代码外部 counter
功能无法触及计数器。他们可以单独创建add
变量,但它与add
使用的计数器不同,并且不会影响counter
的操作。
在第二种情况下,触及全局add
的任何代码都可以影响BitVoicerSerial bitVoicer = BitVoicerSerial(0);
的操作。
答案 1 :(得分:3)
您可能缺少的是第一个添加功能立即执行。这由其声明后面的括号表示。例如:
var something = function(){}();
因为这个立即执行返回一个函数,add变量现在表示返回的函数,其中计数器变量设置为0(它也包含在立即执行的函数中)。
因为它是在一个函数中声明的,所以该计数器变量现在只对该函数可见,因此不会被程序中稍后声明的任何其他计数器变量覆盖。
对add的调用现在运行内部函数,使用在add中声明的计数器变量,现在除了内部函数之外的任何东西都不能再操作了。