为什么我不能像这样访问var我如何解决它?

时间:2016-01-13 11:10:12

标签: javascript

我只是在摆弄,只是想知道是否有可能在这个循环中以某种方式访问​​I变量。

var string = 'abcdefghij';
for(var i = 0; i < 10; i++){
    window[string[i]] = function(){
        console.log(i);
    };
}
a();

显然,由于种种原因,我通常不会在全球范围内这样做,但我想以此为例。

是否仍有办法从此功能中访问i var

3 个答案:

答案 0 :(得分:6)

问题是你在另一个范围内调用i,而未定义范围。

这还不完全正确:

&#13;
&#13;
var string = 'abcdefghij';
for (var i = 0; i < 10; i++) {
  window[string[i]] = (function(i) {
    return function() {
      console.log(i);
    }
  })(i);
}
a()
&#13;
&#13;
&#13;

这个自动执行的函数会将变量i基本复制到它自己的范围内,以便稍后使用。

但是,当您尝试执行上面的函数i时,您会注意到它会抛出错误Uncaught TypeError: i is not a function。这是因为您在for循环var i中使用相同的全局变量,因为您要将函数i设置为。为避免此问题,请在循环周围再次使用相同的技巧。但是请注意,只要再次使用for循环或任何全局变量与动态定义的函数同名,就会再次出现意外问题。

&#13;
&#13;
var string = 'abcdefghij';
(function() {
  for (var i = 0; i < 10; i++) {
    window[string[i]] = (function(i) {
      return function() {
        console.log(i);
      }
    })(i);
  }
})();

i()
&#13;
&#13;
&#13;

答案 1 :(得分:1)

最佳解决方案是使用let代替var。这是一个很好的实践。使用let,变量在最近的块范围内定义。因此,每次迭代后都不会覆盖它们。

'use strict';
var string = 'abcdefghij';
for (let i = 0; i < 10; i++) {
  window[string[i]] = function() {
    console.log(i);
  };
}
a(); //0

答案 2 :(得分:0)

使用闭包技术你可以这样做。当我们通过&#39; i&#39;内在的功能,并立即调用自己。

 var string = 'abcdefghij';
 for (var i = 0; i < 10; i++) {
  window[string[i]] = (function(i) {
    return function() {
      console.log(i);
    }
  })(i);
}
a()