我正在开发一个jQuery插件,我做了类似的事情:
function MyPlugin() { ... }
MyPlugin.prototype = {
foo: function() { ... },
bar: function() { ... },
baz: function() { ... }
}
现在foo
函数运行了一个循环,调用了bar
函数:
foo: function() {
for (i in this.values) {
var result = this.bar(this.values[i]);
}
},
bar: function(value) {
var res = '';
for (i in value) {
// do something
}
return res;
}
现在请忽略函数在这里实际执行的操作,重点是循环本身。我注意到,因为我在i
内使用bar
- 更改 i
foo
的值i
同样。
我之前已经阅读了javascript scoping,但这个例子仍然让我感到困惑。为什么{{1}}在这样的函数之间滑动?它有什么意义吗?我最后只使用了一个不同的变量,但我想知道正确的方法是什么来避免这种问题。
提前致谢!
答案 0 :(得分:2)
变量不仅在功能之间滑动,而且随处可见。由于您尚未在函数中声明变量,因此您使用的是全局变量。
在每个函数中声明变量,每个函数都有自己的变量,只留下全局范围:
foo: function() {
for (var i in this.values) {
var result = this.bar(this.values[i]);
}
},
bar: function(value) {
var res = '';
for (var i in value) {
// do something
}
return res;
}
答案 1 :(得分:1)
由于您没有使用i
指令为var
变量的初始赋值添加前缀,因此JavaScript会创建一个全局变量,该变量在foo和bar函数调用之间共享。相反,你想要:
for (var in in this.values) { ... }
如果this.values
是数组,请不要使用for-in循环。使用普通香草循环以避免循环超过"长度"财产:
for (var i = 0; i < this.values.length; i++) { ... }