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表中

时间: 2024-10-08 10:44:26

ES6的let命令实现猜想的相关文章

ES6之let命令详解

let与块级作用域 { var foo='foo'; let bar='bar'; } console.log(foo,'var'); //foo varconsole.log(bar ,'bar');//Uncaught ReferenceError: bar is not defined 在代码中,使用var申明的变量在代码块外面能被识别,但是let命令却不能被识别,这样就实现了js的块级作用域,我们在使用条件语句 循环语句等就会不担心变量污染的问题了,以下是两种写法等对比: es6: fo

ES6中的let和const命令

1.let命令 1)基本用法 let命令是ES6新增的命令,用来声明变量,类似于var,但let声明的变量只在let命令所在的代码块范围内有效. 2)不存在"声明提前" let声明的变量不存在"声明提前",变量一定要在声明后使用,否则会造成报错,例如: console.log(a);//undefined console.log(b);//报错! var a=3; let b=3: 3)暂时性死区 只要块级作用域内存在let命令,它所声明的变量就绑定了当前块级作用域

let &amp; const 命令

*,html { font-size: 16px } 一.let命令 用于声明变量. 1) 所声明的变量只在let命令所在代码块内有效.(块级作用域) { let a=10; var b=1; } a // ReferenceError: a is not defined b // 1 var li=document.getElementsByTagName("li"); for(let i=0;i<li.length;i++){ li[i].addEventListener(&

ES6学习笔记第二章

let 和 const命令 1 let命令 用法: ES6新增let命令,用于声明变量,用法类似var,只是let声明的变量是块级作用域内有效 例: { let a = 10; var b = 1; } a // a is not defined b // 1 根据返回值可以看出,let声明变量时的作用域只在其代码块内 for 循环的计数器就很适合使用let来声明变量. var a = []; for (var i = 0; i<10; i++){ a[i] = function(){ cons

ES6学习总结

1.ES6的产生 JavaScript 是一个持续演进的编程语言,并由浏览器厂商.开发者和社区成员组成的委员会制定标准.委员会引入了JavaScript历史上的最大更新 ES6 (ES2016),而 ES7 是年度更新的第一版(ES2017). 2.ES6和ES7优点 简化常见编程模式 使代码更容易编写以及定制底层的 JavaScript 行为. 3.新特性 类Class 可以让开发者更容易地编写面向对象程序,并安全地扩展extend JavaScript内建对象. 箭头函数Arrow func

[转] 《ES6标准入门》读书笔记

来源:https://segmentfault.com/a/1190000005863641 let和const命令 ES6新增let命令,用于声明变量,是块级作用域. let声明的变量不会像var声明的变量发生“变量提升”现象,所以,变量一定要在声明后使用,不然就会报错. 暂时性死区:只要块级作用域内存在let命令,它所声明的变量就会“绑定”在这个区域,不再受外部的影响.即在代码块内,使用let命令声明变量之前,这个变量都是不可用的,这在语法上称为“暂时性死区”. ES6规定暂时性死区和不存在

ES6:let和var的区别

let是es6新增的命令,其用法和var差不多,但是还是有些区别的. 一.let是块级命令,var不是块级命令 { let a = 1; var b = 2; } console.log(a); // ReferenceError: a is not defined console.log(b); // 2 同时在代码块里面声明a和b,但是在外面访问的时候只能访问b,说明let的作用域只是在块级里面,用let声明变量可以防止变量泄漏. 在for的循环遍历中就适合用let命令了 for (let

ES6 Class语法学习

前言 大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript 6中引入了类的特性.本文将详细介绍ES6中的类 类的定义 [ES5的类] function Point(x, y) { this.x = x; this.y = y; } Point.prototype.toString = function () { return '(' + this.x +

ES6中class的使用+继承

一.Class 介绍+基本语法(1).介绍通过class关键字,可以定义类.基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰.更像面向对象编程的语法而已. (2).Class 的基本语法 //definedClasses.js //定义类 class Person{ // 构造 constructor(x,y){ this.x = x; this.y = y; } //定义在类中的方法不需要添加functio