JavaScript的Let用法
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用法的更多相关文章
- #Javascript:this用法整理
常用Javascript的人都知道,[this這個關鍵字在一個函式內究竟指向誰]的這個問題很令人頭大,本人在這裡整理了一下Javascript中this的指向的五種不同情況,其中前三種屬於基本的情況, ...
- 好程序员web前端分享javascript关联数组用法总结
好程序员web前端分享javascript关联数组用法总结,有需要的朋友可以参考下. Hash关联数组定义 代码如下 // 定义空数组 myhash = { } // 直接定义数组 myhash = ...
- JS的javascript:void(0)用法
javascript:void(0)用法如下: <a href="javascript:void(0)"></a> // 执行js函数,0表示不执行函数. ...
- Javascript的this用法---阮一峰
Javascript的this用法 作者: 阮一峰 日期: 2010年4月30日 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比 ...
- javascript:void(0);用法及常见问题解析
void 操作符用法格式: javascript:void (expression) 下面的代码创建了一个超级链接,当用户以后不会发生任何事.当用户链接时,void(0) 计算为 0,但 Javasc ...
- [JS]Javascript的this用法
转自:阮一峰 this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 随着 ...
- javascript的setTimeout()用法总结,js的setTimeout()方法
引子 js的setTimeout方法用处比较多,通常用在页面刷新了.延迟执行了等等.但是很多javascript新手对setTimeout的用法还是不是很了解.虽然我学习和应用javascript已经 ...
- javascript array类型用法
javascript高级编程-Array引用类型用法总结 2016-09-17 | 357 引用类型-Array类型 引用类型是一种数据结构,用于将数据和功能联系起来. 创建对象的方式: ...
- javascript typeof()的用法与运算符用法
typeof 运算符 返回一个用来表示表达式的数据类型的字符串. typeof[()expression[]] ; expression 参数是需要查找类型信息的任意表达式. 说明 typeof 运算 ...
- Javascript的this用法及jQuery中$this和$(this)的区别
this是Javascript语言的一个关键字. 它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用.比如, function test(){ this.x = 1; } 1.this就是全 ...
随机推荐
- js设计模式(六)---组合模式
组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构.除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性.基本图例 1.组合模式 ...
- Python学习之旅(二十四)
Python基础知识(23):进程和线程(Ⅱ) 一.threadlocal 在多线程环境下,每个线程都有自己的数据 一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响 ...
- Synctoy2.1使用定时任务0X1
环境描述:公司需要在windows上面使用双向文件同步,目前发现SyncToy可以实现这个功能,但是在Windows 2012上面 ,添加定时任务的时候,执行状态总是0x1,定时任务配置确认多次,肯定 ...
- AJAX----注:借鉴
Ajax的工作原理. Ajax的核心是JavaScript对象XmlHttpRequest.该对象在Internet Explorer5首次引入,它是一种支持异步请求的技术.简而言之,XmlHttpR ...
- try 和 catch 和 finally
try块中出现异常走进catch,异常后面的代码不会再被执行:finally块里try和catch执行完后要执行的代码,且一定会执行. 在释放资源的时候,不要多个放在一个try块里面. 流的关闭顺序: ...
- 新版Ubuntu安装日文输入法
在Ubuntu的设置中安装日文输入法 本周在调试书上代码时需要安装日文输入法,我发现在百度上并没有在最新版Ubuntu下安装日文输入法的教程,于是我写了这篇博客来与大家分享一下我的安装过程. a.如图 ...
- qt 操作注册表,设置ie代理
void SetIEProxy(QString proxy) { QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Wi ...
- [httpd][daily] 查看并修改httpd的最大fd打开个数limit
重要提示: 请直接阅读步骤(6),如果不生效,再回头阅读(1)-(5). 如题: 修改这个文件就行了:/etc/security/limits.conf 查看当前配置的方法: 1. 找到httpd的p ...
- GIT仓库如何恢复到前一次提交
GIT仓库如何恢复到前一次提交 通过使用Git版本恢复命令reset,可以回退版本.reset命令有3种方式: git reset –mixed:此为默认方式,不带任何参数的git reset,即 ...
- python框架之Django(5)-O/RM
字段&参数 字段与db类型的对应关系 字段 DB Type AutoField integer AUTO_INCREMENT BigAutoField bigint AUTO_INCREMEN ...