考虑下面的JavaScript函数(1):何时构建Javascript中的对象?
function setData(domElement) {
domElement.myDataProperty = {
'suppose': 'this',
'object': 'is',
'static': 'and',
'pretty': 'big'
};
};
现在我不喜欢这个功能是完全相同的对象创建的每个函数被调用的时间。由于对象没有改变,我宁愿只创建一次。因此,我们可以做出如下调整(2):
var dataObject = {
'suppose': 'this',
'object': 'is',
'static': 'and',
'pretty': 'big'
};
function setData(domElement) {
domElement.myDataProperty = dataObject;
};
现在,当脚本被加载并存储在dataObject
的对象被创建一次。但是我们假设setData
只是偶尔被调用的 - 大部分时间脚本加载的函数都没有使用。在这种情况下,我不喜欢这个功能,这个对象总是被创建并保存在内存中,包括许多永远不会被使用的场合。我想你可以做这样的事情来达到理想的平衡(3):
var dataObject;
function setData(domElement) {
if (!dataObject) {
dataObject = {
'suppose': 'this',
'object': 'is',
'static': 'and',
'pretty': 'big'
};
}
domElement.myDataProperty = dataObject;
};
这是否合理?我认为这取决于解释者何时决定创建一个对象。它是否真的等待,直到它通过!dataObject
的条件,或者它是否进入函数,试图变得聪明,并决定提前构造它?也许不同的JavaScript引擎有不同的政策呢?
那么当然有一个问题,这些优化在实践中是否会有问题。显然,这取决于像物体的大小,引擎的速度,可用资源的数量等因素。但总的来说,你会说哪一个是更显着的优化:从(1)到(2)或从(2)到(3)?
好点,但请记住,我正在谈论一个永远不会改变的对象,例如典型的功能。 – 2009-08-13 14:12:57
并不重要,JS说它可以改变,你不打算改变它的事实是无关紧要的。你会期待'返回[1,2,3];'总是返回相同的对象,例如? – olliej 2009-08-13 22:19:44