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. 解决vue单页路由跳转后scrollTop的问题

    作为vue的初级使用者,在开发过程中遇到的坑太多了.在看页面的时候发现了页面滚动的问题,当一个页面滚动了,点击页面上的路由调到下一个页面时,跳转后的页面也是滚动的,滚动条并不是在页面的顶部 在我们写路 ...

  2. SecureCRT操作指令

    连接服务器,文件——连接SFTP会话,然后可以help查看命令 传输文件需要明确并处在客户端和服务器端两个正确路径下, 服务器端的操作: cd——去服务器指定的路径 pwd——查看服务器端当前目录 l ...

  3. RoR-Scaffolding

    Scaffolding能快速让rails跑起来 同时也生成JSON response rails g scaffolding "xxx" xxy:integer 生成scaffol ...

  4. daemon函数详解

    https://blog.csdn.net/xinyuan510214/article/details/50903280

  5. cocos2d-x在Android上的编译过程(3):简化Android.mk文件的编写

    在编译动态库时.要求我们要去编写jni/Android.mk文件.告诉编译器编译出来的库时应包括包括编译文件和其它引用库.但对于一个大项目来说,维护这个文件肯定是一件比較繁琐的事情.由于每加一个文件或 ...

  6. java之jedis使用

    下载 依赖jar包下载 使用 # Redis settings redis.host=192.168.208.153 redis.port=6379 redis.pass=1234 redis.tim ...

  7. Cartographer源码阅读(8):imu_tracker

    IMU的输入为imu_linear_acceleration 和  imu_angular_velocity 线加速和角速度.最终作为属性输出的是方位四元数.  Eigen::Quaterniond ...

  8. 9个用来爬取网络站点的 Python 库

    上期入口:10个不到500行代码的超牛Python练手项目 1️⃣Scrapy 一个开源和协作框架,用于从网站中提取所需的数据. 以快速,简单,可扩展的方式. 官网:https://scrapy.or ...

  9. python基础(十三) cmd命令调用

    python cmd命令调用 关于python调用cmd命令: 主要介绍两种方式: 1.python的OS模块. OS模块调用CMD命令有两种方式:os.popen(),os.system(). 都是 ...

  10. linux下视频转gif

    title: linux下视频转gif date: 2017-11-23 16:55:26 tags: linux categories: linux 安装ffmpeg ffmpeg是一套非常强大的音 ...