当我遇到一个有趣的困境时,我正在研究一个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中运行此代码
谢谢。
答案 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引擎)