0
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

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

4

2 回答 2

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 允许您将属性分配给函数。也许这就是你试图通过说“关闭”来理解的内容。

于 2013-11-11T21:14:09.550 回答
2

在这种情况下,它是否是一个函数并不重要,更不用说闭包了,你不妨这样做:

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

var a = createObjectWithProperty(123);
var b = createObjectWithProperty(321);
alert(a.property + " : " + b.property); 
于 2013-11-11T21:07:43.437 回答