闭包是局部变量 一个功能 - 保持活力 功能已经恢复。
我围着JS& jQuery闭包。从上面的定义我的理解是一个闭包允许访问函数外的变量而没有 需要创建全局变量,消除固有风险。我的解释是否正确?
总是非常感谢。
答案 0 :(得分:4)
通常你会认为当你定义一个函数foo
时,它可以读/写的唯一可能的变量是你在调用foo(1, "hello");
时传递给函数的所有参数以及所有global
1}}你定义的变量。这就是类C语言的工作原理。
在 JavaScript 中,您可以在任何地方定义一个函数,除了全局和参数变量之外,该函数还可以在其父作用域中读/写变量;例如:
var global = "global";
function foo() {
var one = 1;
function bar() {
var two = 2;
function argh() {
}
}
}
函数argh
将能够从其所有父作用域读取/写入变量,在这种情况下,two
,one
和global
都可以被函数访问argh
。
我希望这能更好地解释闭包的含义 - 一旦你了解JavaSript中的作用域范围,这并不难。闭包基本上只是能够访问当前和父范围的内部函数...... :)。
这是一个非常强大的概念,特别是在您执行异步事情时。想象一下,你必须定义一个将在不同时刻运行的函数:
// the function we defined below
// will run in 5 seconds in time
setTimeout(function(){
}, 5000);
如果没有JavaScript函数访问父作用域的能力,我们只能访问全局变量。但是使用JavaScript,这更容易,我们可以使用所有可用的局部变量:
var foo = "some local variable";
setTimeout(function(){
alert(foo);
}, 5000);
答案 1 :(得分:1)
技术上是的。实际上不是,它们要复杂得多,而且你用这种语法描述它们的事实表明你对这个概念的理解很差。在你访问了Robert Harvey的链接之后,我会回到引用的来源。
答案 2 :(得分:0)
以下是使用闭包的一个很好的例子:
function makeAddFunction(number1){
function add(number2){
return number1 + number2;
}
return add;
}
var add2 = makeAddFunction(2);
var add5 = makeAddFunction(5);
console.log(add2(2)); //Will print 4 to the console
console.log(add5(2)); //Will print 7 to the console
console.log(add2(1)); //Will print 3 to the console
我发现理解这个概念的最好方法是,当你调用makeAddFunction()并在这种情况下将它存储在变量add2中时,你正在拍摄外部函数data / state的快照。然后,当您调用新函数add2()时,您将访问该数据以及作为参数传入add2()的数据。函数返回后,新参数会死,但原始快照仍然可以使用新参数再次调用。
答案 3 :(得分:0)
到目前为止,我了解到闭包用于存储数据,并且每次内部函数运行时都可以访问该数据。
由于词法作用域,闭包几乎发生了,即函数外部的变量在函数内部可用。