let 语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。

描述

let 允许你声明一个作用域或被限制在块级中的变量、语句或者表达式。

与var不同的是,它声明的变量只能是全局或者整个函数块的换句话,块级 == { }

为什么取‘let’这个名字。

 Let is a mathematical statement that was adopted by early programming languages like Scheme and Basic.
Variables are considered low level entities not suitable for higher levels of abstraction,
thus the desire of many language designers to introduce similar but more powerful concepts like in Clojure, F#, Scala,
where let might mean a value, or a variable that can be assigned, but not changed,
which in turn lets the compiler catch more programming errors and optimize code better.
JavaScript has had var from the beginning, so they just needed another keyword,
and just borrowed from dozens of other languages that use let already as a traditional keyword as close to var as possible,
although in JavaScript let creates block scope local variable instead.
 Let是一个数学声明,是采用于早期的编程语言如Scheme和Basic。
变量被认为是不适合更高层次抽象的低级实体,因此许多语言设计者希望引入类似但更强大的概念,
如在Clojure、f#、Scala,let可能意味着一个值,或者一个变量可以赋值,但不能被更改,
这反过来使编译器能够捕获更多的编程错误和优化代码更好。
javascript从一开始就有var,所以他们只是需要另一个关键字,并只是借用了其他数十种语言,
使用let已经作为一个传统的尽可能接近var的关键字,虽然在javascript 中 let只创建块范围局部变量而已。

作用域规则

let 声明的变量只是在其声明的块或者子块中可用,这一点,与var相似。二者的主要区别在于var声明的变量的作用域是整个封闭函数,而let声明的作用域是块。

 function varTest() {
var x = 1;
if (true) {
var x = 2; // 同样的变量!
console.log(x); //
}
console.log(x); //
} function letTest() {
let x = 1;
if (true) {
let x = 2; // 不同的变量
console.log(x); //
}
console.log(x); //
}

简化内部函数代码

当用到内部函数时候,let 会让你的代码更加简洁。

 var list = document.getElementById('list');

 for (let i = 1; i <= 5; i++) {
let item = document.createElement('li');
item.appendChild(document.createTextNode('Item ' + i)); item.onclick = function(ev) {
console.log('Item ' + i + ' is clicked.');
};
list.appendChild(item);
} // to achieve the same effect with 'var'
// you have to create a different context
// using a closure to preserve the value
for (var i = 1; i <= 5; i++) {
var item = document.createElement('li');
item.appendChild(document.createTextNode('Item ' + i)); (function(i){
item.onclick = function(ev) {
console.log('Item ' + i + ' is clicked.');
};
})(i);
list.appendChild(item);
}

以上示例的工作原理是因为(匿名)内部函数的五个实例引用了变量i的五个不同实例。注意,如果将let 替换为 var, 则它将无法正常工作,因为所有内部函数都将返回相同的i,6是最终值。此外我们可以通过将创建新元素的代码移动到每个循环的作用域来保持循环更清晰。

在程序或者函数的顶层,let 并不会像var 一样在全局对象上创建一个属性,比如:

 var x = "apple";
let y = "apple";
console.log(this.x); //'apple'
console.log(this.y); //undefined

模仿私有接口

在处理构造函数的时候,可以通过let 绑定来共享一个或者多个私有成员,而不使用闭包:

 var Thing;
{
let privateScope = new WeakMap();
let counter = 0; Thing = function(){
this.someProperty = 'foo';
privateScope.set(this, {
hidden: ++counter,
});
}; Thing.prototype.showPublic = function(){
return this.someProperty;
}; Thing.prototype.showPrivate = function(){
return privateScope.get(this).hidden;
};
} console.log(typeof privateScope); //undefined var thing = new Thing();
console.log(thing); //Thing { someProperty: 'foo' }
console.log(thing.showPublic()); //foo
console.log(thing.showPrivate()); //

let 暂存死区的错误

在相同的函数或者块级作用域内重新声明同一个变量会引发SyntaxError

 if (x) {
let foo;
let foo; // TypeError thrown.
}

所以在同一个块区,以let声明的变量,只能声明一次。

其他情况

当在块中使用时,let 将变量的作用域限制为该块。注意var 的作用域在它被声明的函数内区别。

 var a = 1;
var b = 2; if(a === 1){
var a = 11;
let b = 22; console.log(a); //
console.log(b); //
}
console.log(a); //
console.log(b); //

总之,let 的作用域是自己最近的{}

如果你觉得此文对你有一点小小的帮助,可以赞助作者哦,Mike会更加努力出好文~

JavaScript的Let用法的更多相关文章

  1. #Javascript:this用法整理

    常用Javascript的人都知道,[this這個關鍵字在一個函式內究竟指向誰]的這個問題很令人頭大,本人在這裡整理了一下Javascript中this的指向的五種不同情況,其中前三種屬於基本的情況, ...

  2. 好程序员web前端分享javascript关联数组用法总结

    好程序员web前端分享javascript关联数组用法总结,有需要的朋友可以参考下. Hash关联数组定义 代码如下 // 定义空数组 myhash = { } // 直接定义数组 myhash = ...

  3. JS的javascript:void(0)用法

    javascript:void(0)用法如下: <a href="javascript:void(0)"></a> // 执行js函数,0表示不执行函数. ...

  4. Javascript的this用法---阮一峰

    Javascript的this用法   作者: 阮一峰 日期: 2010年4月30日 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比 ...

  5. javascript:void(0);用法及常见问题解析

    void 操作符用法格式: javascript:void (expression) 下面的代码创建了一个超级链接,当用户以后不会发生任何事.当用户链接时,void(0) 计算为 0,但 Javasc ...

  6. [JS]Javascript的this用法

    转自:阮一峰 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着 ...

  7. javascript的setTimeout()用法总结,js的setTimeout()方法

    引子 js的setTimeout方法用处比较多,通常用在页面刷新了.延迟执行了等等.但是很多javascript新手对setTimeout的用法还是不是很了解.虽然我学习和应用javascript已经 ...

  8. javascript array类型用法

    javascript高级编程-Array引用类型用法总结  2016-09-17   |    357 引用类型-Array类型 引用类型是一种数据结构,用于将数据和功能联系起来. 创建对象的方式: ...

  9. javascript typeof()的用法与运算符用法

    typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typeof[()expression[]] ; expression 参数是需要查找类型信息的任意表达式. 说明 typeof 运算 ...

  10. Javascript的this用法及jQuery中$this和$(this)的区别

    this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 1.this就是全 ...

随机推荐

  1. 怎么在Centos7 下让我的mariadb开机启动?(已解决)

    以前我经常使用syscemctl工具在开机后执行 systemctl start mariadb (哈哈,打得可6,只是有点儿麻烦), 如果能开机自启动mariadb就好了. 所以,我想百度下看什么命 ...

  2. javascript 关键字高亮显示实现代码

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  3. InnoDB中锁的算法(2)

    Ⅰ.上节回顾 session1: (root@localhost) [test]> select * from l; +---+------+------+------+ | a | b | c ...

  4. [Day14]Eclipse高级、类与接口作为参数返回值

    l  不同修饰符的使用   类,最常使用public修饰   成员变量,最常使用private修饰   成员方法,最常使用public修饰 l  自定义数据类型的使用   类作为方法参数时,说明要向方 ...

  5. delphi操作sqlite3

    Delphi SQLite 简明无废话上手指南SQLite下载http://www.sqlite.org/download.html SQLite FAQhttp://www.sqlitecn.org ...

  6. Intellij IDEA注册激活破解

    1.2017年适用(2016.3.5到2017.2.4版均生效) 安装IntelliJ IDEA 最新版 启动IntelliJ IDEA 输入 license时,选择输入 [License serve ...

  7. js的字符串代码库及讲解

    1.字符串操作 1.1去除字符串空格 元字符 : \s:空格或者空白等 ^ : 限定开始位置 => 本身不占位置 $ : 限定结束位置 => 本身不占位置 | : 或者 () : 分组代表 ...

  8. DOS的重定向命令及在安全方面的应用

    dos的重定向命令 2006-10-15 16:47 新手DOS应用技巧人小鬼大 重定向命令在安全方面的应用来源:ChinaITLab收集整理2005-7-21 11:12:00 大家知道,DOS下有 ...

  9. 颜色模式、DPI和PPI、位图和矢量图

    颜色模式:用于显示和打印图像的颜色模型 RGB:电子设备的颜色 CMYF:印刷的颜色 印刷的图像分辨率大于等于120像素/厘米,300像素每英寸 图像分辨率单位为PPI(每英寸像素Pixel per ...

  10. 腾讯云主机及CentOS7.2简单上手体验

    前段时间拜读了崔庆才老师的<Python③网络爬虫开发实战>受益良多,对于初学爬虫的新手来说,本书真可谓是通俗易懂,非常适合新手入门.但是受制于没有服务器环境,书中很多例子难以模拟!最近正 ...