refs:
https://www.cnblogs.com/skylar/p/3986087.html
https://coderwall.com/p/_ppzrw/be-careful-with-settimeout-in-loops
1)js没有块级作用域(你可以自己闭包或其他方法实现),只有函数级作用域,函数外面的变量函数里面可以找到,函数里面的变量外面找不到。
变量的查找是就近原则,去寻找var定义的变量,当就近没有找到的时候就去查找外层。
当参数跟局部变量重名时,优先级是等同的。
最近项目平白多了很多错误,提示变量以及被定义过了,也是这个原因。
2)setTimeout在循环中的用法
for (i = 1; i <= 5; ++i) {
setTimeout(console.log(i), 1000);
}
第一个参数一定要加个function(){}包括起来,否则没有延时作用;
for (i = 1; i <= 5; ++i) {
setTimeout(function(){
console.log(i);
}, 1000);
}
将输出5个6,也是因为作用域问题,延时时间到后此时i=6;
可以按如下解决
for (var i = 1; i <= 5; ++i) {
(function(n) {
setTimeout(function(){
console.log(n);
}, 1000);
}(i));
}