JS中 Closures 的主要目的是什么?它只用于公共和私人变量吗?还是有其他我错过的东西。我试图理解关闭,并且真的想知道使用它的主要优点是什么。
答案 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
实现它们。通过使用闭包,即使在函数任务完成后,我们也可以使用私有变量。