• Javascript学习笔记:闭包题解(4)


    代码:

     1 var val1=0;
     2 var val2=0;
     3 var val3=0;
     4 
     5 for(var i1=1;i1<=3;i1++){
     6     var i2=i1;
     7     (function(){
     8         var i3=i2;
     9         setTimeout(function(){
    10             val1+=i1;
    11             val2+=i2;
    12             val3+=i3;
    13         },1);
    14     })();
    15 }
    16 
    17 setTimeout(function(){
    18     console.log(val1);
    19     console.log(val2);
    20     console.log(val3);
    21 },100)

    问题:请写出该段代码打印出的结果。

    正确答案:12,9,6

    解析:setTimeout中的函数会在该段代码运行完之后运行,这是因为Javascript是单进程的,是事件循环模式运行的,setTimeout是将其中的函数在设定的时间之后加入到时间循环队列中,加入到队列之后还需要等待当前执行的函数同步代码执行完之后,才能执行通过setTimeout加入到队列的函数。然后再看i1,i2,i3,由于var是函数级作用域的,因此,i3在每次的匿名函数中都会重新定义,它的作用域只在当前的匿名函数中,因此最后的setTimeout函数中使用的i3是1、2、3,i2和i1都位于全局作用域中,不同的是i1最后比i2多加了一次,因此i1最后的值为4,i2最后的值为3。所以val1=3*i1=12,val2=2*i2=9。

  • 相关阅读:
    前端笔记7
    前端笔记6
    列表、行块元素
    我的学习方法(5)
    (读后摘抄)《计算机程序设计语言的发展》_王汝传
    电影《比利·林恩的中场战事》
    关于优化(1)
    Debug技巧(1)
    奇奇怪怪的东西(1)
    我的学习方法(4)
  • 原文地址:https://www.cnblogs.com/PolarisSky/p/5384931.html
Copyright © 2020-2023  润新知