关于setTimeout的一道经典面试题

想必大家都见过这一道经典的面试题:

for (var i = 1; i <= 5; i++) {
   setTimeout(function test() {
        console.log(i) // 依次输出:6 6 6 6 6
    }, i * 1000);
}

造成这个现象的原因是等到setTimeout异步执行时,i已经变成6了。(不了解的小伙伴可以去看下JS事件循环机制(Even Loop))

那么如何使他输出: 1,2,3,4,5呢?

1.闭包, 保存变量

for (var i = 1; i <= 5; i++) {
    (function (i) {
        setTimeout(function () {
            console.log('闭包:', i); // 依次输出:1 2 3 4 5
        }, i * 1000);
    }(i));
}

在这里创建了一个闭包,每次循环都会把i的最新值传进去,然后被闭包保存起来。

2.bind

for (var i = 1; i <= 5; i++) {
    // 缓存参数
    setTimeout(function (i) {
        console.log('bind', i) // 依次输出:1 2 3 4 5
    }.bind(null, i), i * 1000);
}

实际上这里也用了闭包,我们知道bind会返回一个函数,这个函数也是闭包。

它保存了函数的this指向、初始参数,每次i的变更都会被bind的闭包存起来,所以输出1-5。

3.let

let声明i也可以输出1-5: 因为let是块级作用域,所以每次都会创建一个新的变量,所以setTimeout每次读的值都是不同的。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
settimeout和setinterval是JavaScript中的两个常用函数,用于设置定时器。它们可用于执行一些操作或函数,使其在一段指定的时间后或定期地重复执行。 1. settimeout函数: settimeout函数用于在指定的延迟时间后执行一次指定的代码。它接受两个参数:一个回调函数和一个延迟时间(以毫秒为单位)。 示例: ```javascript setTimeout(function(){ console.log("Hello, world!"); }, 1000); // 1秒后输出 "Hello, world!" ``` 在上述示例中,settimeout函数设置了一个1秒钟的延迟,之后执行了一个匿名函数,该函数输出了"Hello, world!"。 2. setinterval函数: setinterval函数用于以指定的时间间隔重复执行指定的代码。它也接受两个参数:一个回调函数和一个时间间隔(以毫秒为单位)。 示例: ```javascript var counter = 0; var intervalId = setInterval(function(){ counter++; console.log(counter); if(counter === 5) { clearInterval(intervalId); // 当计数器达到5时停止重复执行 } }, 1000); // 每秒输出一个递增的计数器值,直到计数器达到5 ``` 在上述示例中,setinterval函数设置了每秒执行一次的时间间隔,之后执行了一个匿名函数。该函数递增一个计数器,并在控制台输出计数器的值。当计数器达到5时,使用clearinterval函数停止重复执行。 这些函数在前端开发中经常使用,面试可能会涉及它们的用法、参数和注意事项。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值