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声 ...
随机推荐
- uboot环境变量区为何不能放在data段
一.疑问 环境变量也是全局变量,为何不能像其他的全局变量放在data段呢?为什么要放在堆中或者使用ENV_IS_EMBEDDED定义的CFG_ENV_SIZE的空间大小,又为什么需要这么大的空间呢? ...
- reverse string | leetcode
思路:在原来的字符串后面添加上strlen-1个字符,返回 class Solution { public: string reverseString(string s) { unsigned int ...
- hbase 架构
由图可以client并不直接和master交互,而是与zookeeper交互,所以master挂掉,依然会对外提供读写服务, 但master挂掉后无法提供数据迁移服务. 所以说 hbase无单点故障, ...
- bzoj 3545&&3551: [ONTAK2010]Peaks &&加强版 平衡树&&并查集合并树&&主席树
3545: [ONTAK2010]Peaks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 635 Solved: 177[Submit][Stat ...
- Contest20140710 eagleeggs
eagleeggs|eagleeggs.in|eagleeggs.out 题目描述: 共有N个硬度相同的鹰蛋,硬度是一个整数(并且已知其不大于H),表示这个蛋从天上掉下来不摔碎的最大高度.为了找出这个 ...
- php使用domdocument读取xml文件
使用domdocument读取xml文件需要用到以下几个方法和属性: 方法: 1:读取xml文件:load() 2:获取标签的对象数组:getElementByTagName() 3:对象数组的索引: ...
- 关于C语言中用Keil软件制作Lib库文件的几点经验
1.关于制止LIB库文件的几点经验 1. 一个工程如何生成lib文件: 2. 一个生成lib文件的工程可以调用这个工程中不存在的函数,只需要在.h文件中声明这些不存在函数的原型,然后在调用这个lib文 ...
- Condition-线程通信更高效的方式
接近一周没更新<Java线程>专栏了,主要是这周工作上比较忙,生活上也比较忙,呵呵,进入正题,上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且Rea ...
- python换行写入文件
今天用python做写入文件时,碰到,写入的东西不能换行,打开写入的文件都是一行.后来发现需要在写入的字符后面加上+'\n'. 另外python需要追加写入文件的时候,是用这个方法f = open(' ...
- Linux学习笔记3——Linux中常用系统管理命令
stat 显示指定文件的相关信息,比ls命令显示内容更多 who 显示在线登录用户 hostname 显示主机名称 uname显示系统信息 top 显示当前系统中耗费资源最多的进程 ps 显示瞬间的进 ...