Javascript函数副本

Javascript函数副本,javascript,function,Javascript,Function,我有一个关于javascript如何在内部存储功能的问题。 鉴于此代码: var makesomething = function (x) { var thing = { x: x }; thing.do = function () { this.x++; }; return thing; }; var x1 = makesomething(1); var x2 = makesomething(2); 既然我调用了

我有一个关于javascript如何在内部存储功能的问题。 鉴于此代码:

var makesomething = function (x) {
    var thing = {
        x: x 
    };

    thing.do = function () {
        this.x++;
    };

    return thing;
};

var x1 = makesomething(1);
var x2 = makesomething(2);

既然我调用了makesomething函数两次,这是否意味着“do”函数实际上有两个副本,或者对象是否引用了同一个函数,但调用的闭包不同?

有两个副本,每次调用
makesomething()
时都会创建一个副本

您会注意到
x1.do==x2.do
false

如果您这样做:

var doIt = function() {
    this.x++;
};
var makesomething = function (x) {
    var thing = {
        x: x 
    };

    thing.do = doIt;

    return thing;
};

var x1 = makesomething(1);
var x2 = makesomething(2);

然后两者都引用相同的函数,
x1.do==x2.do
将为
true
有两个副本,每次调用
makesomething()
时创建一个副本

您会注意到
x1.do==x2.do
false

如果您这样做:

var doIt = function() {
    this.x++;
};
var makesomething = function (x) {
    var thing = {
        x: x 
    };

    thing.do = doIt;

    return thing;
};

var x1 = makesomething(1);
var x2 = makesomething(2);

然后两者都引用同一个函数,
x1.do==x2.do
将是
true

使用jsfiddle.net进行演示使用jsfiddle.net进行降级从概念上讲,这里有两个“do”函数的副本,但很可能运行时只保留一个实际“编译”代码的副本。@go-oleg-
thing
是“just”访问
do()
的方式是在
makesomething()
之外提供的,它不是概念的一个基本部分-
makesomething()
可以直接返回
do()
,而不存在
thing
并且仍然会有两个
do()
@Pointy-好的观点,尽管这显然取决于特定的JS实现。在我看来,概念副本在这里很重要,因为你可以编写类似的东西,它们只有一个概念副本或实际副本…@nnnnnn是的,我同意-我提到这一点只是为了缓解那些担心大型局部函数会占用大量空间的人的恐惧,因为每个实例都会复制代码。在现代JavaScript虚拟机中,我真的怀疑会发生这种情况(可能在异国情调的情况下除外)。从概念上讲,“do”函数有两个副本,但很可能是运行时只保留了实际“编译”代码的一个副本。@go-oleg-
thing
正是访问
do()的方式
是在
makesomething()
之外提供的,它不是概念的基本部分-
makesomething()
可以直接返回
do()
,而不存在
thing
,仍然会有两个
do()
@Pointy-好的观点,尽管这显然取决于特定的JS实现。在我看来,概念副本在这里很重要,因为你可以编写类似的东西,它们只有一个概念副本或实际副本…@nnnnnn是的,我同意-我提到这一点只是为了缓解那些担心大型局部函数会占用大量空间的人的恐惧,因为每个实例都会复制代码。在现代JavaScript虚拟机中,我真的怀疑这种情况是否会发生(除了在异国情调的情况下)。