理解javascript中的作用域 - 在两个不同的函数中使用相同的临时元素

时间:2014-06-09 20:08:29

标签: javascript scoping

我正在开发一个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}}在这样的函数之间滑动?它有什么意义吗?我最后只使用了一个不同的变量,但我想知道正确的方法是什么来避免这种问题。

提前致谢!

2 个答案:

答案 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++) { ... }