js题集16
2021-06-08 19:03
标签:存储 做了 作用域 bsp function 一个 -- 恶心 执行 1. var value1 = 0, value2 = 0, value3 = 0; for ( var i = 1; i
var i2 = i; (function() { var i3 = i; setTimeout(function() { value1 += i; value2 += i2; value3 += i3; }, 1); })(); } setTimeout(function() { console.log(value1, value2, value3); }, 100); //求结果和why 你可以认为 settimeout是在额外的一个控制器里 不断的push进代码 for里面加闭包 都知道闭包是立即执行 闭包作用域内 值都应该保持着当前执行循环的的值 比如i 应该分别为1,2,3 闭包完了就放掉 but 闭包里有settimeout settimeout里的都是push到额外的控制器里 这种情况下就是 当前轮执行完毕 释放cpu 然后遍历控制器 控制器push了三次settimeout的代码 开始执行 代码开始根据存储时候的作用域找变量的值。 (模型参考event loop)--settimeout怎么保持作用域的==自行研究 所以settimeout里的 值 i是循环执行后的i的终值 4 i2 注意for到3的时候 i2=3;执行后i++;此时i=4,在判断i
所以 i2最终值:3. value1 12 value2 9 最恶心的value3 在闭包里做了这么一个操作 var i3 = i; i3把值输出给了settimeout里后就释放掉了。 第一次循环执行闭包的时候 i3=1 第二次 i3=2 第三次 i3=3; 对应的对应的settimeout push代码的时候就相当于 。。。 value3+=1; 。。。 value3+=2; 。。。 value3+=3; js题集16 标签:存储 做了 作用域 bsp function 一个 -- 恶心 执行 原文地址:http://www.cnblogs.com/tong24/p/7305781.html