javascript如何在循环内创建变量 vari,j; 对于(i=0;i

javascript如何在循环内创建变量 vari,j; 对于(i=0;i,javascript,variables,Javascript,Variables,No.JavaScript。因此,所有变量声明都会到达定义它们的函数的顶部。因此,所有这些变量只创建一次,并且它们的值在循环中每次都会更改。您的两个版本是相同的。没有区别。变量j不会被创建和销毁30次。两者@thefourtheye和@Remigius Kijok的答案是正确的。每当在函数中(或在全局范围内)声明和初始化变量时,声明就会被提升到该范围的顶部 您可以通过包装函数中的for循环,然后在浏览器中执行该函数来自己看到这一点。具体地说,通过在函数顶部设置断点,您可以看到所有变量在e函数执行

No.JavaScript。因此,所有变量声明都会到达定义它们的函数的顶部。因此,所有这些变量只创建一次,并且它们的值在循环中每次都会更改。

您的两个版本是相同的。没有区别。变量j不会被创建和销毁30次。

两者@thefourtheye和@Remigius Kijok的答案是正确的。每当在函数中(或在全局范围内)声明和初始化变量时,声明就会被提升到该范围的顶部

您可以通过包装函数中的
for
循环,然后在浏览器中执行该函数来自己看到这一点。具体地说,通过在函数顶部设置断点,您可以看到所有变量在e函数执行

for (var i=0; i<30; i++) {
    for (var j=0; j<10; j++) {
        // do something
    }
}
var loopy=函数(){
对于(变量i=0;i<5;i+=1){
对于(var j=0;j<3;j+=1){
log('i是'+i+',j是'+j');
}
}
};
loopy();//在此处放置断点


正如您在照片中看到的,我正在使用Chrome的开发工具,并在
loopy()的执行上放置一个断点
。进入函数后,但在执行
for
循环的任何
之前,变量i和j都被声明,但
未定义

变量var
被提升。我个人认为第一个更干净,但它是等效的。关键是你误解了“javascript的作用域逻辑”,
for
语句没有任何特殊作用域,函数有。
第二种方法创建和销毁j 30次(让j=0;j为您的假设提供有效的理论/实践确认将是理想的。请不要介意我打断,但对于第二个示例,在顶部提升的变量是否每次都会被覆盖,因为它每次都以var关键字开始?@al-Zami No。只有在有赋值的情况下才会被覆盖。Javascript没有嗯,开发工具并不是演示这一点的最佳方式,因为结果在很大程度上取决于编译器如何优化代码(请参阅)。但是,您可以通过显示
function(){j=0;console.log(j);if(false){var j=1;}console.log(j)}来演示这一点
打印
0
——也就是说,即使从未对带有
var
的语句求值,
j
仍然存在并且可以保存一个值。如果查看范围变量部分,您可以清楚地看到,在执行函数中的任何代码行之前,
i
j
变量都是
未定义的ned
for (var i=0; i<30; i++) {
    for (var j=0; j<10; j++) {
        // do something
    }
}
var loopy = function () {
  for (var i = 0; i < 5; i += 1) {
    for (var j = 0; j < 3; j += 1) {
      console.log('i is ' + i + ' and j is ' + j);
    }
  }
};

loopy(); // place break point here