2013-07-06 41 views
0

我有一个关于javascript如何在内部存储函数的问题。 鉴于此代码: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功能的两倍,这是否意味着有本质上是“做”功能的两个副本或做对象具有参考同样的功能,但被调用不同关闭?

+0

使用jsfiddle.net用于演示 – KarSho

回答

5

有两个副本,一个每次叫​​时创建的。

你会发现,x1.do === x2.dofalse

相反,如果你这样做:

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.dotrue

+0

有概念上的“做”功能的两个副本,但它很可能是在运行时只保留实际的“编译”代码一个副本的情况。 – Pointy

+0

@去,奥列格 - 'thing'是访问')“公正”的方式做()'是由makesomething的'可用外(',它不是概念的重要组成部分 - 'makesomething()'可以只直接返回'do()'而没有'thing'并且仍然会有'do()'的两个副本。 – nnnnnn

+0

@nnnnnn:好点 –