在函数调用中循环计数器可见性

时间:2015-12-14 07:06:59

标签: javascript function variables

当我遇到一个有趣的困境时,我正在研究一个javascript项目,我的for循环中的计数器在一个名为for循环内部的函数中可见。这是一个例子:

function callback(){
  console.log("My value is " + i);
}

function setup(){
  for(i=0; i<3; i++){
    callback();
  }
}

setup();

该程序的输出是:

My value is 0
My value is 1
My value is 2

如果我在调用在其i循环中使用for的函数的i循环中使用变量for,则会出现此问题。我知道我可以在回调函数中使用不同的变量,但我不相信这在所有情况下都是实用的。

我在Firefox 42.0中运行此代码

谢谢。

3 个答案:

答案 0 :(得分:1)

您的pwm_ena是一个全局变量。您已在这两个函数之外声明它,并且可以在它们中访问它。

始终使用局部变量作为循环计数器:

i

答案 1 :(得分:1)

这是未定义变量的结果,导致全局范围内的自动定义/使用。这是无效的,并且会在严格模式下抛出异常,应该被视为一个错误,并且始终要避免。

此行为不仅限于for或任何其他用途。

正确的用法是始终在相关范围内定义变量:

'use strict'
function callback(){
  var i;
  console.log("My value is " + i); // i is undefined
}

function setup(){
  var i;
  for(i=0; i<3; i++){
    callback();
  }
}

setup();

答案 2 :(得分:1)

这是典型的程序员对变量范围的误解。

在您的情况下,由于未声明变量,javascript engine将其添加到全局范围,因此它也可以在for循环之外访问。

你可以通过在for循环中声明一个局部范围变量来解决这个问题,这样它的可见性就不会暴露在for循环范围之外。

JS CODE:

function callback(){
 console.log("My value is " + i);
}

function setup(){
  for(i=0; i<3; i++){
    callback();
  }
}

setup();

注意:这通常发生在每个开发人员身上,这就是为什么我建议你在你的javascript代码'use strict'中使用严格模式(这会为所有那些早先被忽略的无声错误抛出错误)通过JavaScript引擎)

More info about Strict Mode @ MDN