考虑以下JavaScript:
<script>
function Ninja() {
var feints = 0;
this.getFeints = function() {
return feints;
}
this.feint = function() {
feints++;
}
this.increaseByTwo = function() {
feints = feints + 2;
}
}
var ninja = new Ninja();
ninja.feint();
console.log(ninja.getFeints()); //outputs one
ninja.increaseByTwo();
console.log(ninja.getFeints()); // outputs three
</script>
我是否正确地说上面的代码创建了四个闭包
或者JavaScript会创建两个闭包
答案 0 :(得分:2)
所有三个内部函数都有一个指向同一环境的闭包,因此里面有变量。这通常是the whole point of having closures:
在计算机科学中,闭包(也是词汇封闭或功能 closure)是一个函数或函数的引用 引用环境 - 存储对每个引用的引用的表 该函数的非局部变量(也称为自由变量)。1 闭包 - 与普通函数指针不同 - 允许函数访问 那些非局部变量,即使在其直接调用之外也是如此 词汇范围。
请注意,这是内存泄漏的常见原因,因为您并不总是意识到您正在保留这些引用。
查看Google's Javascript Style Guide says about closures。
然而,要记住的一件事是闭包保持一个指针 到它的封闭范围。因此,将闭包附加到DOM element可以创建循环引用,从而产生内存泄漏。
答案 1 :(得分:1)
只是,
忍者内部的每个内部功能一个
如果您要创建大量Ninja
s,那么使用Ninja
的{{1}}扩展是明智的。
所以,做:
prototype
答案 2 :(得分:0)
执行该代码时会发生什么?让我们逐步完成它:
Ninja
构造函数。在全局变量范围内。Ninja
构造函数
feints
),该环境位于声明Ninja
的全局范围内。ninja
上执行方法。每个,
什么是关闭?根据我的理解,Ninja()
的私有变量环境比函数调用更长。因此,您的代码只会创建一个闭包。
请参阅@ dystroy的答案,它提供了有用的信息。如果我在某处使用技术上不正确的术语,我很抱歉。 Afaik,EcmaScript规范称为“变量环境”,我称之为执行上下文,范围是词汇环境 - 请参阅section 10。