在这种特殊情况下,闭包如何工作?

时间:2013-11-11 21:03:09

标签: javascript

function createFunctionWithProperty(property) {
    functionWithProperty.property = property;
    return functionWithProperty;
    function functionWithProperty() {
    }
}

var a = createFunctionWithProperty(123);
var b = createFunctionWithProperty(321);
alert(a.property + " : " + b.property);  // 123 : 321

据我所知,createFunctionWithPropertyfunctionWithProperty都是函数声明,它们在执行任何JavaScript代码之前都会被提升,解析并生成。但是在某些时刻,在调用createFunctionWithProperty函数时,functionWithProperty变成了一个闭包,这是functionWithProperty函数的一个非常特殊的实例,它有自己的属性和变量,它是关闭的。每个实例都有所不同。这一切都在理论上,但在这种情况下,我不明白事情是如何运作的。是否有人会详细分析functionWithProperty何时以及如何成为一个闭包。谢谢。

2 个答案:

答案 0 :(得分:2)

在这种情况下,如果它是一个单独的闭包函数并不重要,你可能也做过:

function createObjectWithProperty(property) {
    var objectWithProperty = {};
    objectWithProperty.property = property;
    return objectWithProperty;
}

var a = createObjectWithProperty(123);
var b = createObjectWithProperty(321);
alert(a.property + " : " + b.property); 

答案 1 :(得分:2)

您发布的这个示例代码看起来像是举例,而不是闭包。如果你改变:

function createFunctionWithProperty(property) {
    functionWithProperty.property = property;
    return functionWithProperty;
    function functionWithProperty() {
    }
}

为:

function createFunctionWithProperty(property) {
    functionWithProperty.property = property;
    return functionWithProperty;
    var functionWithProperty = function () {
    }
}

您会看到虽然var functionWithProperty = function () {}function functionWithProperty() {}都是宣布某个功能的方法,但其中一个将被悬挂,而另一个则不会。虽然这两个函数都充当闭包,但这个例子并没有给出一个很好的例子,说明它们为什么充当闭包,或者与javascript中的闭包相关的好处或陷阱。

编辑:我想它也是一个很好的例子,说明函数是如何在javascript(大多数)中的第一类对象。与其他语言不同,javascript允许您为函数指定属性。也许这就是你想通过说“封闭”来理解的。