代码是否在封闭之下?为什么呢?
var getContact = (function(){
var person = {name: "John Doe"};
return {aFriend: person};
})();
console.log(getContact.aFriend.name);
//outputs: John Doe

答案 0 :(得分:5)
没有。
在外部函数执行完毕后,可以访问的另一个函数中没有声明函数。
在这个例子中:
function createClosure() {
var foo = 0;
function bar() {
alert(foo);
}
return bar;
}
var myFunc = createClosure();
...变量foo
已关闭,因此有一个闭包。
答案 1 :(得分:2)
所有JavaScript函数都是闭包;他们会在创建活动时保留对lexical environment object处于活动状态的引用。所以从技术上来说,简短地在那里创建了一个闭包,但是在那个代码中没有闭包持续任何时间长度。该函数被创建,调用,然后释放;什么都没有维护它的引用,所以它不会生存,它引用的词汇环境对象可以被回收。在函数中创建对象并不会为对象提供对函数(或环境对象)的引用,因此函数不会被保留,因此它不会保留它将环境封闭在记忆中。
对比:
(function outer(x) {
setTimeout(function inner() {
alert(x);
}, 100);
})("foo");

在那里,我们创建了两个闭包(outer
和inner
),但outer
几乎立即释放(就像你的例子);在计时器触发并且计时器子系统释放其对它的引用之后,inner
被释放大约100ms。
答案 2 :(得分:0)
getContact是一个返回对象的IIFE(立即调用的函数表达式)。这里没有创建内部函数,它引用外部函数的环境变量。在我看来,它不应该被视为封闭,仍在等待解释,这可以证明这是一个封闭。