2013-07-06 64 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:好點 –