javascript函数范围,变量声明
可以说我有以下情况:
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可能更有效,因为变量位于本地函数作用域中,所以在函数退出后,执行上下文将被销毁,释放用于参数的资源......变量将不会被分配到全局对象'窗口'。
那么什么方法表现最好? 为什么?
[编辑]
谢谢你的回答!
如果代码具有可读性问题,则不存在问题...我现在只对性能/内存使用感兴趣。
如果你不用var i
声明你的变量,那么它们就变成全局的。
总是声明你的变量。 如果你做了任何基准测试,你会发现声明的局部变量实际上更快而隐含的全局变量。 你也不会以这种方式泄漏到全局状态。
基准!
正如你所看到的,性能是相同的。
就内存使用而言,局部变量(test1)可能更好,因为编译器不必记住该函数有5个参数。
但是这是一个纳米优化如果你关心这个口径写组件的性能差异。 寻找可读和可修改的代码。
[编辑]
没有注意到方法参数中的“本地”变量。 这是一个可读性杀手! 不要这样做。 你会发现test1
可能更有效率。
test1
的变量也是本地的。 你用var i
声明它们。 这些方法没有区别。 “test1”中的变量全部用var
声明,所以它们不是全局的。 这两个应该基本相同。