传递数组时全局变量被提升
global variable gets hoisted when passing an array
如果他们的某个地方有类似的答案,我很抱歉。所有的吊装答案似乎都没有完全回答我的问题。我有一个全局变量似乎只能得到 "hoisted" (我不完全理解)
当我将数组传递给函数时。我不明白为什么这会改变什么。
var i = 0 //counter for show pattern
//this first function works fine. the console.log shows i = 0
function myLoop () {
console.log("My loop:" + i);
setTimeout(function () {
alert('hello');
i++;
if (i < 3) {
myLoop();
}
}, 3000)
}
//this second function shows i as undefined. If I remove list, then the console logs i as 0 which is correct
function showPattern(list){
console.log(list[0] + i);
setTimeout(function(){
console.log("IT works!");
//for each square on the screen
$(".square").each(function(j,obj){
console.log($(obj).attr("id") + "/" + list[i]);
//if the ID is equal to the pattern number
if(parseInt($(obj).attr("id")) === parseInt(list[i])){
$(obj).css("opacity","1");
setTimeout(function(){
$(obj).css("opacity",".5");
}, 500);
}
})
i++;
if( i < list.length){
showPattern();
}
},3000);
}
通过提升,只有语句 var i = 0
(var i
) 的声明部分被提升。 i = 0
部分没有。因此,当您的代码(没有 list
)运行并遇到:
list[i]
i
未定义。但是,当您通过 list
然后点击该行时:
list[0] + i
+
符号将 i
隐式转换为与 list[0]
(字符串或数字)兼容的默认类型。
我认为 "var i" 的提升根本不是你的问题。第二个函数将中断(当您不传入数组时),因为您尝试在控制台日志中引用 list[0]。您正在尝试访问不存在的数组的索引 0。如果没有传入数组,则会引发错误。
这段代码也会有这个问题:
if( i < list.length){
showPattern();
}
如果他们的某个地方有类似的答案,我很抱歉。所有的吊装答案似乎都没有完全回答我的问题。我有一个全局变量似乎只能得到 "hoisted" (我不完全理解) 当我将数组传递给函数时。我不明白为什么这会改变什么。
var i = 0 //counter for show pattern
//this first function works fine. the console.log shows i = 0
function myLoop () {
console.log("My loop:" + i);
setTimeout(function () {
alert('hello');
i++;
if (i < 3) {
myLoop();
}
}, 3000)
}
//this second function shows i as undefined. If I remove list, then the console logs i as 0 which is correct
function showPattern(list){
console.log(list[0] + i);
setTimeout(function(){
console.log("IT works!");
//for each square on the screen
$(".square").each(function(j,obj){
console.log($(obj).attr("id") + "/" + list[i]);
//if the ID is equal to the pattern number
if(parseInt($(obj).attr("id")) === parseInt(list[i])){
$(obj).css("opacity","1");
setTimeout(function(){
$(obj).css("opacity",".5");
}, 500);
}
})
i++;
if( i < list.length){
showPattern();
}
},3000);
}
通过提升,只有语句 var i = 0
(var i
) 的声明部分被提升。 i = 0
部分没有。因此,当您的代码(没有 list
)运行并遇到:
list[i]
i
未定义。但是,当您通过 list
然后点击该行时:
list[0] + i
+
符号将 i
隐式转换为与 list[0]
(字符串或数字)兼容的默认类型。
我认为 "var i" 的提升根本不是你的问题。第二个函数将中断(当您不传入数组时),因为您尝试在控制台日志中引用 list[0]。您正在尝试访问不存在的数组的索引 0。如果没有传入数组,则会引发错误。
这段代码也会有这个问题:
if( i < list.length){
showPattern();
}