JavaScript变量在循环外部还是内部声明?
在AS3中,我认为应该初始化循环外部的所有变量,以提高性能。JavaScript也是这样吗?哪个更好/更快/最佳实践JavaScript变量在循环外部还是内部声明?,javascript,performance,Javascript,Performance,在AS3中,我认为应该初始化循环外部的所有变量,以提高性能。JavaScript也是这样吗?哪个更好/更快/最佳实践 var value = 0; for (var i = 0; i < 100; i++) { value = somearray[i]; } var值=0; 对于(变量i=0;i
var value = 0;
for (var i = 0; i < 100; i++)
{
value = somearray[i];
}
var值=0;
对于(变量i=0;i<100;i++)
{
value=somearray[i];
}
或
for(变量i=0;i<100;i++)
{
var值=somearray[i];
}
理论上,它在JavaScript中不会有任何区别,因为该语言没有块作用域,只有函数作用域
我不确定performance参数,但仍然建议将var
语句作为函数体中的第一个语句。引述自:
JavaScript没有块作用域,因此在块中定义变量可能会使熟悉其他C族语言的程序员感到困惑。在函数顶部定义所有变量
我认为他有道理,正如你在下面的例子中所看到的。在函数顶部声明变量不应使读者误以为变量i
位于for
循环块的范围内:
function myFunction() {
var i; // the scope of the variables is very clear
for (i = 0; i < 10; i++) {
// ...
}
}
函数myFunction(){
var i;//变量的范围非常清楚
对于(i=0;i<10;i++){
// ...
}
}
好吧,这取决于你想要实现什么。。。如果value
假设它只是循环块中的一个临时变量,那么使用第二种形式就更清楚了。它也更具逻辑性和详细性。明年,所有浏览器都将有预编译代码的JS引擎,因此性能差异(来自一次又一次地解析同一代码块,再加上执行赋值)应该可以忽略不计
此外,除非必须,否则永远不要优化性能。将变量放在第一次需要它们的地方可以保持代码整洁。消极的一面是,习惯使用具有块作用域的语言的人可能会感到困惑。ECMA-/Javascript
language会将任何声明在函数顶部的变量提升。这是因为该语言与许多其他类似C语言一样,具有功能范围
,而不具有块范围
。
这也称为词法范围
如果你申报的是
var foo = function(){
for(var i = 0; i < 10; i++){
}
};
因此,这对性能没有任何影响(如果我在这里完全错了,请纠正我)。
not在函数顶部以外的地方声明变量的一个更好的参数是可读性。在for循环
中声明变量可能会导致错误的假设,即该变量只能在循环体中访问,这是完全错误的。事实上,您可以在当前范围内的任何地方访问该变量。在JavaScript或ActionScript中,在含义或性能上绝对没有差异
var
是解析器的指令,而不是在运行时执行的命令。如果某个特定标识符在函数体(*)中的任何位置声明了一次或多次var
,则该标识符在块中的所有使用都将引用局部变量。将value
声明为var
在循环内、循环外或两者都声明没有区别
因此,你应该写你认为最可读的东西。我不同意Crockford的观点,将所有变量放在函数的顶部总是最好的。对于在代码段中临时使用变量的情况,最好在该段中声明var
,以便该段独立并可以复制粘贴。否则,在重构期间将几行代码复制粘贴到一个新函数中,而无需单独挑选和移动关联的var
,您就得到了一个意外的全局变量
特别是:
for (var i; i<100; i++)
do something;
for (var i; i<100; i++)
do something else;
for(var i;i我刚刚在Chrome中做了一个简单的测试。请在浏览器中尝试并查看结果
var count = 100000000;
var a = 0;
console.log(new Date());
for (var i=0; i<count; i++) {
a = a + 1
}
console.log(new Date());
var j;
for (j=0; j<count; j++) {
a = a + 1;
}
console.log(new Date());
var j;
for (j=0; j<count; j++) {
var x;
x = x + 1;
}
console.log(new Date());
var计数=100000000;
var a=0;
console.log(新日期());
对于(var i=0;i javascript是C或C++底部写的一种语言,我不太确定是哪一种,它的目的之一是节省处理内部内存的浪费。
即使在C或C++中,当变量在一个循环内声明时,你也不必担心它是否会消耗大量资源。为什么你应该在JavaScript中担心它? < P>这里的问题是在循环中声明一个var。
var a = 30;
var a = 50;
var a = 60;
你认为这是对的吗?不……因为你不想多次声明一个变量。当你在循环中声明一个变量时,它不会声明循环运行的次数吗?显然,当你处于“使用严格”模式时,它会打你一巴掌。人们在没有考虑原始问题的情况下不同意Crockford
因此,在顶部声明变量总是很好的——1.为了可读性,2.养成良好的习惯。另一个考虑因素,现在我们在ES2015中有了let
和const
,就是您现在可以将变量专门作用于循环块。因此,除非您在循环外需要相同的变量(或者,如果每个迭代都依赖于在上一次迭代中对该变量所做的操作),则最好这样做:
for (let i = 0; i < 100; i++) {
let value = somearray[i];
//do something with `value`
}
for(设i=0;i<100;i++){
设value=somearray[i];
//做有价值的事`
}
在Linux操作系统上对Chrome、Firefox和jsperf运行测试后,在循环内变量声明和循环外变量声明之间似乎存在性能差异。这是一个很小的差异,但迭代量和变量声明量也会使这一差异更加复杂
因此,为了获得最佳性能,我会
var a = 30;
var a = 50;
var a = 60;
for (let i = 0; i < 100; i++) {
let value = somearray[i];
//do something with `value`
}
function a() {
console.log('Function a() starts');
console.log(new Date());
var j;
for (j=0; j<100000000; j++) {
var x;
x = x + 1;
}
console.log(new Date());
console.log('Function a() Ends');
}
a()
function b() {
console.log('Function B() starts');
console.log(new Date());
var a;
var j;
for (j=0; j<100000000; j++) {
a = a + 1;
}
console.log(new Date());
console.log('Function B() Ends');
}
b()
Function a() starts
VM121:3 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:9 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:10 Function a() Ends
VM121:14 Function B() starts
VM121:15 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:21 Thu Apr 12 2018 15:20:26 GMT+0530 (India Standard Time)
VM121:22 Function B() Ends
for (let i = 0, sum = 0; i < count; i++) { // count also be declared here like count = array.length;
sum = sum + 1;
}