今天看了看阮一峰的《ECMAScript 6入门》的let和const命令,看完let之后自己测试了一把,仿佛处在云里雾里之中。代码如下:
"use strict";let o = {};for (let i=0; i<10; i++) { var j = i; console.log('for before ... i: ' + j); o[j] = function(){ i ++; console.log('func one ... i: ' + i); var f = function(){ i ++; console.log('func two ... i: ' + i); }; f(); }; o[j](); console.log('for end ... i: ' + i); console.log();}console.log('------------');for (var key in o) { var fn = o[key]; console.log('key: ' + key); fn(); fn(); console.log();}
运行结果如下:
for before ... i: 0func one ... i: 1func two ... i: 2for end ... i: 2for before ... i: 3func one ... i: 4func two ... i: 5for end ... i: 5for before ... i: 6func one ... i: 7func two ... i: 8for end ... i: 8for before ... i: 9func one ... i: 10func two ... i: 11for end ... i: 11------------key: 0func one ... i: 3func two ... i: 4func one ... i: 5func two ... i: 6key: 3func one ... i: 6func two ... i: 7func one ... i: 8func two ... i: 9key: 6func one ... i: 9func two ... i: 10func one ... i: 11func two ... i: 12key: 9func one ... i: 12func two ... i: 13func one ... i: 14func two ... i: 15
从结果中我总结出如下规律:
1.let变量会隐式传递到下层函数里面;
2.函数接收到上层传递来let变量后,会开辟一块新的内存,用以保存该变量;
3.函数处理完上层传递来的let变量后,会隐式返回给上层并更新上层的let变量。
那么该如何实现呢?我是这样想的:
1.在每个函数(包括顶层(函数))里面都设置一张let表;
2.在定义函数的时候拷贝一份let表数据,添加到函数的let表里面,并标记来源;
3.当函数执行结束,将let表中从上层传递过来的变量用新值更新回上层的let表中