对JS闭包进行闭包
Putting a closure to JS Closures
闭包是一个函数-在函数已返回。
我正在把我的头裹在JS&jQuery闭包。根据上面的定义,我的理解是闭包允许访问函数外部的变量,而不需要需要创建全局,消除固有风险。我的解释正确吗?
一如既往的感谢。
通常情况下,当您定义函数foo
时,它可以读/写的唯一可能变量是当函数被称为foo(1, "hello");
时传递给它的参数以及您定义的所有global
变量。这就是类C语言的工作原理。
然而,在JavaScript中,您可以在的任何地方定义函数,除了全局变量和参数变量外,该函数还可以读取/写入其父作用域中的变量;例如:
var global = "global";
function foo() {
var one = 1;
function bar() {
var two = 2;
function argh() {
}
}
}
函数argh
将能够从其所有父作用域读取/写入变量,在这种情况下,函数argh
都可以访问two
、one
和global
。
我希望这能更好地解释闭包的含义——一旦你了解了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);
技术上是的。事实上,不,它们要复杂得多,你用语法来描述它们的事实表明你对这个概念的理解很差。在你访问了罗伯特·哈维的链接后,我会回到引用的消息来源。
这里有一个使用闭包的好例子:
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(((的数据。函数返回后,新参数将失效,但原始快照仍在那里,可以使用新参数再次调用。
到目前为止,我所理解的是闭包用于存储数据,并且每次运行内部函数时都可以访问这些数据。
闭包几乎是由于词法范围而发生的,即函数外的变量在函数内可用。
- 从js引擎的角度来看闭包和构造函数是如何工作的
- 闭包js框架-将ArrayBuffer转换为字符串
- 在JS中调用闭包
- Node.js设计:多个异步函数使用作为闭包传递的函数写入数据库
- 何时在Node.js V8中分配和编译闭包
- 未使用JS闭包将变量传递给onClick函数
- Node.js:异步代码 + js 闭包的问题
- 节点 js 中的闭包未按预期工作
- 这和javascript中的闭包(在纸上工作.js)
- node.js-在闭包时使用相同的变量名
- React js:为什么我无法创建闭包
- JS:闭包中存储哪些/变量
- 闭包中的局部变量如何成为 Ext JS 中的私有成员变量
- 如何识别 js 是否是闭包编译的
- 使用闭包编译器时出现非法字符错误.jar使用 ANT 进行 r.js 优化
- navigator.useragent引用在闭包编译的js中丢失
- 闭包编译器和Prototype.js:危险的使用
- 闭包编译器--包括目录中的所有.js文件
- 将Backbone.js放入javascript匿名闭包中
- 闭包(JS)迭代程序