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中的函数是词法而不是动态作用域.这意味着它们在定义它们的范围内运行,而不是从它们执行的作用域.当定义函数时,当前作用域链被保存并成为其中的一部分功能的内部状态."
因此,明显的优势是您可以根据需要将任何对象(函数,对象等)与范围链一起带入.这也可以被视为风险,因为如果您不小心,您的应用程序可以轻松消耗大量内存.
我认为总结封闭目的的最佳短语是:
使用函数闭包,您可以将数据存储在单独的作用域中,并仅在必要时共享它.
如果要模拟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)
| 归档时间: |
|
| 查看次数: |
16859 次 |
| 最近记录: |