setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。
语法:
setTimeout(code, milliseconds, param1, param2, ...)
setTimeout(function, milliseconds, param1, param2, ...)
直接console
for(var i = 0; i < 5; i++) {
console.log(i); // 0 1 2 3 4
}
var 定时器时间为1000
setTimeout是异步执行,在执行setTimeout时,i已经为5了
for(var i = 0; i < 5; i++) {
setTimeout(
function() {
console.log(i) // 5 5 5 5 5
}, 1000)
}
var 定时器时间为0
for(var i = 0; i < 5; i++) {
setTimeout(
function() {
console.log(i) // 5 5 5 5 5
}, 0)
}
如果想要输出 0 1 2 3 4
一 、利用setTimeout的第三个参数
var ,将i作为参数传递给setTimeout
for(var i = 0; i < 5; i++) {
setTimeout(
function(i) {
console.log(i) // 0 1 2 3 4
}, 1000, i)
}
二、使用IIFE(立即执行的匿名函数)
for(var i = 0; i < 5; i++) {
(function(i){
setTimeout(
function() {
console.log(i) // 0 1 2 3 4
}, 1000)
})(i)
}
三、使用bind方法
bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用。
bind MDN详细解释
for(var i = 0; i < 5; i++) {
setTimeout(
function(i) {
console.log(i) // 0 1 2 3 4
}.bind(null,i), 1000)
}
四、es6中的let声明的变量是具有块级作用域
let 定时器时间为0
for(let i = 0; i < 5; i++) {
setTimeout(
function() {
console.log(i) // 0 1 2 3 4
}, 0)
}
let 定时器时间为1000
let 语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。
let声明的变量只在其声明的块或子块中可用,这一点,与var相似。二者之间最主要的区别在于var声明的变量的作用域是整个封闭函数。
for(let i = 0; i < 5; i++) {
setTimeout(
function() {
console.log(i) // 0 1 2 3 4
}, 1000)
}