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声 ...
随机推荐
- Visual Studio C/C++ 编译器选项
优化- /O1 最小化空间 /O2 最大化速度/Ob<n> 内联扩展(默认 n=0) /Od 禁用优化(默认) ...
- Uva_11762 Race to 1
题目链接 题意: 给一个数n, 每次从小于等于n的素数里选一个P, 如果能被n整除, 那么就n就变成n / P. 问: n 变成1的期望. 思路: 设小于等于n的素数有p 个, 其中是n的约数的有g个 ...
- RAC oracle删除数据库
24:site2-DMS1:~ # su - oracleoracle@site2-DMS1:~> sqlplus / as sysdba SQL*Plus: Release 11.2.0.3. ...
- tyvj 1342 教主泡嫦娥 环上DP
342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国的方 ...
- Asm.js: Javascript的编译目标
正如许多开发者一样,我也为Asm.js的前景而感到兴奋不已.最近的新闻——Asm.js正 在被Firefox支持——引起了我的兴趣.同样感兴趣的还有Mozilla和Epic声明(mirror)他们已经 ...
- 【Java】WEB-INF目录与META-INF目录的作用
/WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/包含了站点所有用的 class 文件,包括 ser ...
- Java位运算在程序设计中的使用:位掩码(BitMask)
在Java中,位运算符有很多,例如与(&).非(~).或(|).异或(^).移位(<<和>>)等.这些运算符在日常编码中很少会用到. 在下面的一个例子中,会用到位掩码( ...
- 【HDOJ】2255 奔小康赚大钱
最大二分图匹配,O(n^3). /* 2255 */ #include <iostream> #include <algorithm> #include <cstdio& ...
- phpMyAdmin 完整路径泄露漏洞3
漏洞名称: phpMyAdmin 完整路径泄露漏洞 CNNVD编号: CNNVD-201307-652 发布时间: 2013-08-09 更新时间: 2013-08-09 危害等级: 中危 漏洞类 ...
- android日历控件(一)
自定义日历并且具备设置今天以前的时间不可点选,以前的颜色和当前的颜色不同,以及获取两次点击日期之间间隔的天数所以说细节比较多 个人习惯,先上图 靠,笔记本不知道怎么回事,禁用到触摸板之后 再次唤醒屏幕 ...