闭包

一道笔试题

var arr = ['第一次','第二次','第三次'];

for(var i=0;i<arr.length;i++){
    setTimeout(function(){
        document.getElementById('info').innerHTML = arr[i];
    },i*10000);
}

你认为这会输出什么?警惕别跳入圈套里。
效果为:

  1. undefined
  2. 10秒后输出 undefined
  3. 20秒后输出 undefined

为何呢?由于i是全局变量,当for轮回实行完毕后,i固然即是数组长度,所以三次效果都是第三次。现实测试效果都是undefined,由于只要当i=3的时刻才完毕for轮回,而arr[3]示意数组的第四个元素,现实arr数组里只要三个元素,所以arr[3]也就即是undefined

运用闭包的体式格局处理

var arr = ['第一次','第二次','第三次'];

for(var i=0;i<arr.length;i++){
    (function(num){
        setTimeout(function(){
            document.getElementById('info').innerHTML = arr[num];
        },num*10000);
     })(i);
}

关于setTimeout实行流的题目,这里有一个栗子

console.log(1);
setTimeout(function(){console.log(2);},0);
console.log(3);
setTimeout(function(){console.log(4);},0);
console.log(5);

实行效果

13524

以上实行效果,能够剖析到虽然setTimeout得时候设置为0,但setTimeout需要等代码流实行完毕后再来实行setTimeout函数块

    原文作者:Doyle
    原文地址: https://segmentfault.com/a/1190000002387070
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞