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?