我只是在摆弄,只是想知道是否有可能在这个循环中以某种方式访问I变量。
var string = 'abcdefghij';
for(var i = 0; i < 10; i++){
window[string[i]] = function(){
console.log(i);
};
}
a();
显然,由于种种原因,我通常不会在全球范围内这样做,但我想以此为例。
是否仍有办法从此功能中访问i var
?
答案 0 :(得分:6)
问题是你在另一个范围内调用i
,而未定义范围。
这还不完全正确:
var string = 'abcdefghij';
for (var i = 0; i < 10; i++) {
window[string[i]] = (function(i) {
return function() {
console.log(i);
}
})(i);
}
a()
&#13;
这个自动执行的函数会将变量i
基本复制到它自己的范围内,以便稍后使用。
但是,当您尝试执行上面的函数i
时,您会注意到它会抛出错误Uncaught TypeError: i is not a function
。这是因为您在for循环var i
中使用相同的全局变量,因为您要将函数i
设置为。为避免此问题,请在循环周围再次使用相同的技巧。但是请注意,只要再次使用for循环或任何全局变量与动态定义的函数同名,就会再次出现意外问题。
var string = 'abcdefghij';
(function() {
for (var i = 0; i < 10; i++) {
window[string[i]] = (function(i) {
return function() {
console.log(i);
}
})(i);
}
})();
i()
&#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()