- 函数声明:类似function aaa(){},
函数表达式,类似var aaa=function(){},
匿名函数:类似function(){} - 函数表达式即var aaa=function(){
}(), 后面加()表示立即调用,函数声明则不会调用。与**(function() {}) () 和 (function() {} ())
**三者是一样的。
for (var i = 0; i < 5; i++) {
console.log(i);
}
都知道输出为0,1,2,3,4
下面:
for (var i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 0);
// 输出为5个5
}
原因是:js是单线程执行,先执行同步,再执行异步,即使settimeout等待时间为0,此时i值为全局变量,只能保存最后一个值5.
解决方法:(1)
for (let i = 0; i < 5; i++) {
setTimeout(function() {
console.log(i);
}, 0);
// 输出为0,1,2,3,4
}
let相当于在每个块级作用域中都声明了一个变量。
(2)
for (var i = 0; i < 5; i++) {
(function(j) {
setTimeout(function() {
console.log(j);
}, i * 1000);
})(i);
}
形成一个函数作用域,将i值变成局部变量
(3)
for (var i = 0; i < 5; i++) {
setTimeout(function(j) {
console.log(j);
}, i * 1000,i);
// 输出为0,1,2,3,4
}
常见的是settimeout形式是有两个参数,第一个为回调函数,第二个为延迟时间,其实后面可以传参数
for (var i = 0; i < 5; i++) {
setTimeout((function(a,b) {
console.log(a+b);
}), i * 1000,3,3);
}//输出为5个6
(4)
for (var i = 0; i < 5; i++) {
setTimeout(function(j) {
console.log(j);
}(i), i * 1000);
// 输出为0,1,2,3,4
}
和(3)不一样的是,即使有延迟时间,也会立即执行
总结,其实就是把i值变成私有值