假设我有以下情况:
var namespace = {};
(function($)
{
$.extend(namespace,
{
test1: function(someArray, someObj)
{
for(var i= 0, ii= someArray.length;i<ii;i++)
{
var text = someObj[someArray[i]];
// do something with text
}
},
test2: function(someArray, someObj,i,ii,text)
/*
see that the i,ii,text are unused parameters,
that will be used instead of variables
*/
{
for(i= 0, ii= someArray.length;i<ii;i++)
{
text = someObj[someArray[i]];
// do something with text
}
},
});
})(jQuery);
现在,test1和test2的结果是一样的......但是性能,内存使用情况如何...... 以上述两种方式声明i,ii,测试变量之间有什么区别吗?
我认为test2可能更有效,因为变量在本地函数范围内,因此在函数退出后,执行上下文被破坏,释放用于参数的资源......变量将不被分配到全局对象'窗口'。
那么什么方法表现最好?为什么?
[编辑]
谢谢大家的回答!
如果代码存在可读性问题,则没有问题......我现在只对性能/内存使用情况感兴趣。
答案 0 :(得分:1)
如果您没有使用var i
声明变量,那么它们将成为隐式全局变量。
始终声明您的变量。如果您对此进行了任何基准测试,您会发现声明的局部变量实际上比隐含的全局变量更快。你也不会以这种方式泄漏到全球状态。
正如您所看到的,表现相同。
就内存使用而言,局部变量(test1)可能更好,因为编译器不必记住该函数有5个参数。
但这是纳米优化如果你关心这个口径的性能差异,请写程序集。转到可读和 maintanable 代码。
<强> [编辑] 强>
没有注意到方法参数中的“本地”变量。那是一个可读性杀手!不要那样做。你会发现test1
可能更有效率。
答案 1 :(得分:1)
test1
中也是本地的。您正在使用var i
声明它们。
这些方法没有区别。答案 2 :(得分:0)
“test1”中的变量都是用var
声明的,所以它们不全局。这两者应该基本相同。
答案 3 :(得分:0)
test1更快,因为每当JavaScript查找符号(例如变量名称)时,它都会通过查看本地范围来开始。因此,通过使用全局范围,它必须在更多位置查找符号。这同样适用于参数,但它们比全局变量更好。
答案 4 :(得分:0)
这可能是微不足道的,但是在每次迭代中声明一个新的变量(文本)都需要我相信新的内存分配。虽然我不确定javascript如何处理。我通常事先声明变量然后为此原因分配值,但这只是因为有人说“嘿,你应该这样做”并提出相同的论点。