ES6的let命令实现猜想
今天看了看阮一峰的《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: 0
func one ... i: 1
func two ... i: 2
for end ... i: 2 for before ... i: 3
func one ... i: 4
func two ... i: 5
for end ... i: 5 for before ... i: 6
func one ... i: 7
func two ... i: 8
for end ... i: 8 for before ... i: 9
func one ... i: 10
func two ... i: 11
for end ... i: 11 ------------
key: 0
func one ... i: 3
func two ... i: 4
func one ... i: 5
func two ... i: 6 key: 3
func one ... i: 6
func two ... i: 7
func one ... i: 8
func two ... i: 9 key: 6
func one ... i: 9
func two ... i: 10
func one ... i: 11
func two ... i: 12 key: 9
func one ... i: 12
func two ... i: 13
func one ... i: 14
func two ... i: 15
从结果中我总结出如下规律:
1.let变量会隐式传递到下层函数里面;
2.函数接收到上层传递来let变量后,会开辟一块新的内存,用以保存该变量;
3.函数处理完上层传递来的let变量后,会隐式返回给上层并更新上层的let变量。
那么该如何实现呢?我是这样想的:
1.在每个函数(包括顶层(函数))里面都设置一张let表;
2.在定义函数的时候拷贝一份let表数据,添加到函数的let表里面,并标记来源;
3.当函数执行结束,将let表中从上层传递过来的变量用新值更新回上层的let表中
ES6的let命令实现猜想的更多相关文章
- ES6之let命令详解
let与块级作用域 { var foo='foo'; let bar='bar'; } console.log(foo,'var'); //foo varconsole.log(bar ,'bar') ...
- ES6之let命令
ES6新增了let命令,用来声明变量.它的用法类似于var. let和var声明变量的区别: 1.let声明的变量,只在let命令所在的代码块内有效,出了这个块级作用域就不起作用 先看一个例子: { ...
- 【ES6】let 命令
let命令 为es6新增命令,用来声明变量,类似于var,但是let所声明的变量,只在let命令所在的块级作用域内有效 块级作用域写法(ES6块级作用域允许任意嵌套): // 块级作用域写法 { le ...
- ES6之const命令
一直以来以ecma为核心的js始终没有常量的概念,es6则弥补了这一个缺陷: const foo='foo'; foo='bar';//TypeError: Assignment to constan ...
- ES6(let.contest命令)
1.作用域概念? 1.全局作用域 2.函数作用域 3.块级作用域(ES6新增) 2.如何使用let和const? 1.代码: 运行结果为1.将let改为var,发现结果不变. 代码: 发现报错!!!( ...
- ES6的let命令
1.let命令所在的代码块内有效: 2.循环的计数器,就很合适使用let命令:(for循环还有一个特别之处,就是循环语句部分是一个父作用域,而循环体内部是一个单独的子作用域.) 例如:如下会输出十次s ...
- 【ES6 】const命令
本质 const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动. 对于简单类型的数据(数值.字符串.布尔值),值就保存在变量指向的那个内存地址,因此等同于常量. ...
- es6
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- [转] 《ES6标准入门》读书笔记
来源:https://segmentfault.com/a/1190000005863641 let和const命令 ES6新增let命令,用于声明变量,是块级作用域. let声明的变量不会像var声 ...
随机推荐
- BenchmarkDotNet
.NET Core性能测试组件BenchmarkDotNet 支持.NET Framework Mono .NET Core 超强性能测试组件BenchmarkDotNet 支持Full .NET F ...
- 手动实现 NSTabViewController 的 Rect Transition 及 Propagate Title-b
不知为何 我在 OS X 10.11.5 及 Xcode 7.3 的 Storyboard 中设置 Tab View Controller 的 Transition 属性时,Tab View Cont ...
- iOS:实现表格填充和选择操作
功能:创建一个列表,用数组填充表格,并支持选择列表行 // // main.m // Hello // // Created by lishujun on 14-8-28. // Copyright ...
- android学习小例子——验证码倒计时按钮
1.activity_main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andro ...
- python时间处理
1.获取当前时间的两种方法: import datetime,time now = time.strftime("%Y-%m-%d %H:%M:%S") print now now ...
- Matlab读取cifar10 train_quick.sh输出txt中信息
感谢 网友 Vagrant的提醒.之前 一直就看个最后的accuracy.这个应该并不靠谱.最好把说有的信息都看一下.而一个一个看.根本记不住.只能把数据读取在图片中显示一下,才比较直观. 本文就是读 ...
- 【andorid】Attribute is missing the Android namespac
初学安卓,错误颇多 出现这个问题,是因为xml节点属性单词拼写错了,比如android我写成了adnorid,当然就错误了.
- Hadoop下各技术应用场景
数据采集和DataFlow 对于数据采集主要分为三类,即结构化数据库采集,日志和文件采集,网页采集.对于结构化数据库,采用Sqoop是合适的,可以实现结构化数据库中数据并行批量入库到hdfs存储.对于 ...
- [SQL Server]一次执行资料夹内的.sql 指令码
原文:[SQL Server]一次执行资料夹内的.sql 指令码 初始资料库时,我们Developers们会准备很多.sql指令码来建立资料表.检视甚至初始资料,那麽要怎麽一次执行资料夹内的*.sql ...
- Java Random随机种子
第一种情况 Random rand = new Random(47); for(int i=0;i<10;i++) System.out.println(rand.nextInt(100)); ...