javascript关闭优势?

时间:2011-06-10 17:24:34

标签: javascript closures

JS中 Closures 的主要目的是什么?它只用于公共和私人变量吗?还是有其他我错过的东西。我试图理解关闭,并且真的想知道使用它的主要优点是什么。

4 个答案:

答案 0 :(得分:11)

闭包与javascript的范围有关。换句话说,由于javascript设计者所做的范围选择(即词法范围),闭包是可能的。

javascript中闭包的优点是它允许您将变量绑定到执行上下文。

var closedIn = {};

var f = function(){
   closedIn.blah = 'blah'; // closedIn was just "closed in" because I used in the function, but it was defined outside the function.
}

在该示例中,您有一个名为closedIn的普通对象文字。它是在一个函数中访问的。因此,javascript知道它必须将closedIn带到函数f的任何位置,因此它可用于f

this关键字很棘手。 this始终是对执行范围的引用。您可以捕获一个上下文的this以在另一个上下文中使用,如下所示:

var that = this;
var f = function(){
    that.somethingOnThat();
   // `this` means the scope f, `that` means whatever 'this' was when defined outside of the function
}

如果您正在编写面向对象的javascript并希望回调可以访问某些外部作用域,那么这个技巧可能非常有用。

引用Javascript书:

  

“JavaScript中的函数是词法上的   而不是动态范围。这个   意味着它们在范围内运行   它们是定义的,而不是范围   他们被执行。当一个   函数定义,当前范围   链被保存并成为其中的一部分   功能的内部状态。“

因此,明显的优势是您可以根据需要将任何对象(函数,对象等)与作用域链一起带入。这也可能被视为风险,因为如果您不小心,您的应用程序可能会轻松消耗大量内存。

答案 1 :(得分:5)

我认为总结闭包目的的最佳短语是:

数据封装

使用函数闭包,您可以将数据存储在单独的范围内,并仅在必要时共享。

如果你想模仿private static variables,你可以在函数内定义一个类,并在闭包中定义private static vars

(function () {
    var foo;
    foo = 0;
    function MyClass() {
        foo += 1;
    }
    MyClass.prototype = {
        howMany: function () {
            return foo;
        }
    };
    window.MyClass = MyClass;
}());

答案 2 :(得分:2)

由于大多数需要回调函数的API(例如,“onclick”函数)不提供其他机制来向这些回调函数发送参数(或明确设置“this”),因此javascript中必须使用闭包。指针)。相反,您需要使用闭包来允许回调访问“父”函数中的变量。

我个人希望它们不是必需的,因为它们很难理解,难以阅读代码(并不总是清楚范围内究竟是什么),并且制造了奇怪的错误。相反,我希望有一个回调标准,允许你发送参数等。但我接受我在这个观点中占少数。

答案 3 :(得分:0)

我们知道,在函数中定义的变量具有局部作用域。我们无法从函数外部访问它们。

问题1

局部变量是在调用函数时创建的,并且在函数的任务完成时将被销毁。这意味着局部变量的寿命比全局变量短。我们可以使用全局变量来解决该问题。

程序启动时全局变量可用,程序结束时销毁全局变量。在整个程序中也可以使用它们。

问题2

由于全局变量可在整个程序中访问,因此它们很容易在任何地方进行更改。

我们想要什么?

我们希望具有数据持久性+数据封装。

我们可以使用Closures实现它们。通过使用闭包,即使在函数任务完成后,我们也可以使用私有变量。