考虑以下Javascript函数(1):
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)?
解决方法:
答案是,你不应该知道.您展示的示例之间几乎没有差别.您有理由担心这一点的唯一方法是,如果您有实际证据表明这种或那种方式明显损害了特定解释器的性能或内存使用率.在那之前,解释器的工作就是为你担心这些东西.
那就是说,如果你真的想知道……试试看,然后找出答案.拨打不同版本1,000,000次,看看它有什么不同.
制作一个巨大版本的物体,看看是否会产生凹痕.观看任务管理器.试试不同的浏览器报告您的结果.这是一个更好的方式来找出,而不仅仅是在互联网上询问他们猜测可能是什么情况下的一堆混蛋.
请记住,无论如何,对象必须在内存中,而不是……作为源文本