对JS闭包进行闭包

Putting a closure to JS Closures

本文关键字:闭包 JS      更新时间:2023-09-26

闭包是一个函数-在函数已返回。

我正在把我的头裹在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都可以访问twooneglobal

我希望这能更好地解释闭包的含义——一旦你了解了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(((的数据。函数返回后,新参数将失效,但原始快照仍在那里,可以使用新参数再次调用。

到目前为止,我所理解的是闭包用于存储数据,并且每次运行内部函数时都可以访问这些数据。

闭包几乎是由于词法范围而发生的,即函数外的变量在函数内可用。