JavaScript关闭优势?

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


我认为总结封锁目的的最佳措辞是:

数据封装

通过函数闭包,您可以将数据存储在单独的作用域中,并仅在必要时共享。

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

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

闭包与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中的函数在词汇上而不是动态范围内,这意味着它们运行在它们被定义的范围内,而不是它们被执行的范围。当一个函数被定义时,当前范围链被保存并成为函数的内部状态“。

所以清楚的优点是,只要有必要,您可以将任何对象(函数,对象等)与范围链一起带入。 这也可以被认为是一种风险,因为如果你不小心,你的应用程序可以轻易地消耗大量内存。


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

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

链接地址: http://www.djcxy.com/p/51603.html

上一篇: javascript closure advantages?

下一篇: How does the delay parameter of setTimout() work within a loop?