javascript关闭优势?

Jay*_*Jay 17 javascript closures

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

hvg*_*des 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.
}
Run Code Online (Sandbox Code Playgroud)

在该示例中,您有一个名为的普通对象文字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
}
Run Code Online (Sandbox Code Playgroud)

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

引用Javascript书籍:

"JavaScript中的函数是词法而不是动态作用域.这意味着它们在定义它们的范围内运行,而不是从它们执行的作用域.当定义函数时,当前作用域链被保存并成为其中的一部分功能的内部状态."

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


zzz*_*Bov 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;
}());
Run Code Online (Sandbox Code Playgroud)