js--ES6-Promise与经典循环闭包题

2017-03-25  本文已影响0人  栗子酥小小

Sat Mar 25 2017 12:40:11 GMT+0800 (中国标准时间) 5
undefined
VM87:3 Sat Mar 25 2017 12:40:12 GMT+0800 (中国标准时间) 5
VM87:3 Sat Mar 25 2017 12:40:12 GMT+0800 (中国标准时间) 5
VM87:3 Sat Mar 25 2017 12:40:12 GMT+0800 (中国标准时间) 5
VM87:3 Sat Mar 25 2017 12:40:12 GMT+0800 (中国标准时间) 5
VM87:3 Sat Mar 25 2017 12:40:12 GMT+0800 (中国标准时间) 5

  1. 可以用闭包:(每次把新的变量i传进一个匿名的立即执行函数,每次 j
    都能得到不同的 i ,因为j在匿名函数的作用域内,函数的执行作用域每执行一次都会重新生成,所以每次的 j 都不是同一个)
    for (var i = 0; i < 5; i++) {
    (function(j) { // j = i
    setTimeout(function() {
    console.log(new Date, j);
    }, 1000);
    })(i);
    }

            console.log(new Date, i);
    
  2. 可以用传参法:(其实是把闭包的匿名函数扩展出来)
    function wrapper(j) {
    // function fn() {
    // console.log(new Date, j);
    // }
    // setTimeout(fn,1000);
    // 上面全部的写法,等价于:
    setTimeout(function () {
    console.log(new Date, j);
    },1000);
    }
    for (var i = 0; i < 5; i++) {
    wrapper(i);
    }
    console.log(new Date, i);
    输出如下:

Sat Mar 25 2017 13:20:57 GMT+0800 (中国标准时间) 5
undefined
VM94:8 Sat Mar 25 2017 13:20:58 GMT+0800 (中国标准时间) 0
VM94:8 Sat Mar 25 2017 13:20:58 GMT+0800 (中国标准时间) 1
VM94:8 Sat Mar 25 2017 13:20:58 GMT+0800 (中国标准时间) 2
VM94:8 Sat Mar 25 2017 13:20:58 GMT+0800 (中国标准时间) 3
VM94:8 Sat Mar 25 2017 13:20:58 GMT+0800 (中国标准时间) 4

注意:这里有一个容易犯错的点,setTimeout的第一个参数要求的是一个函数的引用,而不是执行一个函数,所以只能传入函数名xxx的形式,而不能传入xxx(a,b),这也意味着不能在xxx上直接传参。
再补充一个重要知识点,如果一定要在xxx中传参,又不想用闭包,可以使用setTimeout的第3个参数,从第3个参数往后的参数,都会传入xxx里作为形参使用。

Sat Mar 25 2017 13:37:27 GMT+0800 (中国标准时间) 0
VM2209:3 Sat Mar 25 2017 13:37:27 GMT+0800 (中国标准时间) 1
VM2209:3 Sat Mar 25 2017 13:37:27 GMT+0800 (中国标准时间) 2
VM2209:3 Sat Mar 25 2017 13:37:27 GMT+0800 (中国标准时间) 3
VM2209:3 Sat Mar 25 2017 13:37:27 GMT+0800 (中国标准时间) 4
VM2209:7 Sat Mar 25 2017 13:37:27 GMT+0800 (中国标准时间) 5
undefined

ES6及Promise登场

Sat Apr 01 2017 13:15:47 GMT+0800 (中国标准时间) 0
(index):41 这是一个小补充哟0
(index):45 这是then里的一点小补充哟0
(index):39 Sat Apr 01 2017 13:15:48 GMT+0800 (中国标准时间) 1
(index):41 这是一个小补充哟1
(index):45 这是then里的一点小补充哟1
(index):39 Sat Apr 01 2017 13:15:49 GMT+0800 (中国标准时间) 2
(index):41 这是一个小补充哟2
(index):45 这是then里的一点小补充哟2
(index):39 Sat Apr 01 2017 13:15:50 GMT+0800 (中国标准时间) 3
(index):41 这是一个小补充哟3
(index):45 这是then里的一点小补充哟3
(index):39 Sat Apr 01 2017 13:15:51 GMT+0800 (中国标准时间) 4
(index):41 这是一个小补充哟4
(index):45 这是then里的一点小补充哟4
(index):60 Sat Apr 01 2017 13:15:52 GMT+0800 (中国标准时间) 5

最后强调一遍,resolve的回调函数是在本轮“事件循环”结束时执行,setTimeout(fn, 0)在下一轮“事件循环”开始时执行。
上一篇 下一篇

猜你喜欢

热点阅读