为JS闭包设置一个闭包

时间:2011-04-26 15:56:52

标签: javascript

  

闭包是局部变量   一个功能 - 保持活力   功能已经恢复。

我围着JS& jQuery闭包。从上面的定义我的理解是一个闭包允许访问函数外的变量而没有 需要创建全局变量,消除固有风险。我的解释是否正确?

总是非常感谢。

4 个答案:

答案 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将能够从其所有父作用域读取/写入变量,在这种情况下,twooneglobal都可以被函数访问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)

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

由于词法作用域,闭包几乎发生了,即函数外部的变量在函数内部可用。