zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    网络编程基础
    面试题
    面试题合集
    异常
    三个重要的模块loggning,hashlib,configparse
    面向对象进阶
    单例模式
    反射
    封装
    开发规范
  • 原文地址:https://www.cnblogs.com/PolarisSky/p/5384931.html
Copyright © 2011-2022 走看看