这是封闭吗?

时间:2017-01-07 11:45:23

标签: javascript

代码是否在封闭之下?为什么呢?



var getContact = (function(){
	var person = {name: "John Doe"};
	return {aFriend: person};
})();
console.log(getContact.aFriend.name);
//outputs: John Doe




3 个答案:

答案 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");




在那里,我们创建了两个闭包(outerinner),但outer几乎立即释放(就像你的例子);在计时器触发并且计时器子系统释放其对它的引用之后,inner被释放大约100ms。

答案 2 :(得分:0)

getContact是一个返回对象的IIFE(立即调用的函数表达式)。这里没有创建内部函数,它引用外部函数的环境变量。在我看来,它不应该被视为封闭,仍在等待解释,这可以证明这是一个封闭。