let 声明了一个块级域的局部变量,并且可以给它一个初始化值。

语法EDIT

let var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]];

参数

var1var2, …, varN
变量名。变量名可以定义为任何合法标识符。
value1value2, …, valueN
变量的初始化值。该值可以为任何合法表达式。

描述EDIT

let 允许把变量的作用域限制在块级域中。与 var 不同处是:var 申明变量要么是全局的,要么是函数级的,而无法是块级的。

在块级域中用 let

用 let 在一个代码块中定义变量.

if (x > y) {
let gamma = 12.7 + y;
i = gamma * x;
}

在用到内部函数的时候,let 能够让代码更简洁,比如:

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

for (var i = 1; i <= 5; i++) {
var item = document.createElement("LI");
item.appendChild(document.createTextNode("Item " + i)); let j = i;
item.onclick = function (ev) {
console.log("Item " + j + " is clicked.");
};
list.appendChild(item);
}

上面这段代码的意图是创建5个li,点击不同的li能够打印出当前li的序号。如果不用let,而改用var的话,将总是打印出 Item 5 is Clicked,因为 j 是函数级变量,5个内部函数都指向了同一个 j ,而 j 最后一次赋值是5。用了let后,j 变成块级域(也就是花括号中的块,每进入一次花括号就生成了一个块级域),所以 5 个内部函数指向了不同的 j 。

作用域规则

用 let 定义的变量的作用域是定义它们的块内,以及包含在这个块中的子块 ,这一点有点象var,只是var 定义的变量的作用域是定义它们的函数内 :

function varTest() {
var x = 31;
if (true) {
var x = 71; // same variable!
console.log(x); // 71
}
console.log(x); // 71
} function letTest() {
let x = 31;
if (true) {
let x = 71; // different variable
console.log(x); // 71
}
console.log(x); // 31
}

在程序或者函数的顶层,let 的表现就象 var 一样:

var x = 'global';
let y = 'global';
console.log(this.x);
console.log(this.y);

上面这段代码的运行后会显示两次"global"。

注:在 Safari[版本 9.1.1 (9537.86.6.17)]与 chrome[ 版本50.0.2661.102 (64-bit)]中 y 将是 undefined

let 的暂存死区与错误

在同一个函数或同一个作用域中用let重复定义一个变量将引起 TypeError.

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

在 ECMAScript  2015中,  let 将会提升这个变量到语句块的顶部。然而,在这个语句块中,在变量声明之前引用这个变量会导致一个 ReferenceError的结果, 因为let变量 在"暂存死区" (从块的开始到声明这段).

function do_something() {
console.log(foo); // ReferenceError
let foo = 2;
}

在 switch 声明中你可能会遇到这样的错误,因为一个switch只有一个作用块.

switch (x) {
case 0:
let foo;
break; case 1:
let foo; // TypeError for redeclaration.
break;
}

循环定义中的let作用域

循环体中是可以引用在for申明时用let定义的变量,尽管let不是出现在大括号之间.

var i=0;
for ( let i=i ; i < 10 ; i++ ) {
console.log(i);
}

注:以上 let 申明的 i 将会变成 undefined;chrome 版本50.0.2661.102 (64-bit);推荐以下写法:

var i=0;
for ( let l = i ; l < 10 ; l++ ) {
console.log(l);
}

域作用规则

for (let expr1; expr2; expr3) statement

在这个例子中,expr2expr3, 和 statement 都是包含在一个隐含域块中,其中也包含了 expr1.

例子EDIT

let  对比 var

let的作用域是块,而var的作用域是函数

var a = 5;
var b = 10; if (a === 5) {
let a = 4; // The scope is inside the if-block
var b = 1; // The scope is inside the function console.log(a); // 4
console.log(b); // 1
} console.log(a); // 5
console.log(b); // 1

let 在循环中

可以用 let 来代替 var ,在 for 定义块中使用块级变量.

for (let i = 0; i<10; i++) {
console.log(i); // 0, 1, 2, 3, 4 ... 9
} console.log(i); // i is not defined

非标准的 let 扩展EDIT

let块let block)

let blocks 在 Gecko 44 中已经废除( bug 1167029) 。

let块提供了一种在块的范围内获取变量的值,而不会影响块外面名字相同的变量的值的方法。

语法

let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) block;

描述

let 语句块为变量提供了局部作用域。它的作用是在单一代码块的词法范围内绑定零个或多个变量; 此外与普通语句块没有任何区别。需要特别注意的是, 在 let 语句块内使用 var 声明的变量,它的作用域与在 let 语句块之外声明没有区别;这样的变量仍然具有函数作用域。在使用 let 语句块时,必须使用花括号,否则会导致语法错误。

例子

var x = 5;
var y = 0; let (x = x+10, y = 12) {
console.log(x+y); // 27
} console.log(x + y); // 5

let 代码块的规则与 JavaScript 中其他类型的代码块相同。允许在块内通过 let 关键字声明局部变量。

作用域规则

使用 let 语句块绑定的变量,其作用域是 let 语句块本身,与任何其内部语句块的作用域一样,除非在这些内部语句块内又定义了同名的变量。

let 表达式( let expression)

let expression 在 Gecko 41 已经废除

let表达式 可以将变量的作用域仅作用于一条语句。

语法

let (var1 [= value1] [, var2 [= value2]] [, ..., varN [= valueN]]) expression;

例子

你可以在一条语句的范围中使用 let 关键字来设立变量:

var a = 5;
let(a = 6) console.log(a); // 6
console.log(a); // 5

作用域规则

给定一个 let 表达式:

let (decls) expr

javascript 中的 let 作用域的更多相关文章

  1. Javascript中闭包的作用域链

    作用域定义了在当前上下文中能够被访问到的成员,在Javascript中分为全局作用域和函数作用域,通过函数嵌套可以实现嵌套作用域. 闭包一般发生在嵌套作用域中.闭包是JavaScript最强大的特性之 ...

  2. javascript中的this作用域详解

    javascript中的this作用域详解 Javascript中this的指向一直是困扰我很久的问题,在使用中出错的机率也非常大.在面向对象语言中,它代表了当前对象的一个引用,而在js中却经常让我觉 ...

  3. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

  4. JavaScript 中变量、作用域和内存问题的学习

    这是我学习JavaScript的第二篇文章,之前做过几年的Java开发,发现JavaScript虽然也是面向对象的语言但是确实有很多不同之处.就本篇博客,主要学习总结一下最近学习到的JavaScrip ...

  5. javascript中的变量作用域以及变量提升详细介绍

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解变量作用域 “一个变量的作用域表示这个变量存在的上下文 ...

  6. javascript中的变量作用域

    在网上看了一道js面试题 <script type="text/javascript"> var tt = 'aa'; function test() { alert( ...

  7. JavaScript中变量、作用域、内存问题

    这几天,闲的没事看看JavaScript高级编程,感觉JavaScript真的很强大,尤其是采用面向对象的编程方式. 一.   基本类型和引用类型的值: ECMAScript变量可能包含两种不同数据类 ...

  8. javascript中的函数作用域和声明提前

    在一些类C的编程语言中,花括号内的每一段代码都具有各自作用域,并且变量在声明他们的代码段之外是不可见的,这个概念叫做块级作用域. javascript中没有块级作用域的概念,有的是函数作用域的概念:变 ...

  9. JavaScript学习系列2一JavaScript中的变量作用域

    在写这篇文章之前,再次提醒一下 JavaScript 是大小写敏感的语言 // 'test', 'Test', 'TeSt' , 'TEST' 是4个不同的变量名 JavaScript中的变量,最重要 ...

随机推荐

  1. JAVE not work in linux

    1, it will print out exception, but still can convert the audio 2, it works in windows not linux, ne ...

  2. Session和Cache的区别

    以前实现数据的缓存有很多种方法,有客户端的Cookie,有服务器端的Session和Application.其中Cookie是保存在客户端的一组数据,主要用来保存用户名等个人信息.Session则保存 ...

  3. 【小白学游戏常用算法】二、A*启发式搜索算法

    在上一篇博客中,我们一起学习了随机迷宫算法,在本篇博客中,我们将一起了解一下寻路算法中常用的A*算法. 通常情况下,迷宫寻路算法可以使用深度优先或者广度优先算法,但是由于效率的原因,不会直接使用这些算 ...

  4. 【Ajax 基础学习】

    http://www.cnblogs.com/guduoduo/p/3681296.html 今天简单的学习了 Ajax 的基础知识,总结在这里.部分代码不是原创,特此说明. [Ajax 简介] AJ ...

  5. HDU5716 : 带可选字符的多字符串匹配

    shift-and算法,设$v[i][j]$表示文本串长度为$i$的前缀能否匹配模式串长度为$j$的前缀,$f[i][j]$表示字符$i$能否匹配模式串的第$j$个位置,那么有$v[i+1][j+1] ...

  6. C++STL -- vector实现

    STL的vector简化实现 本质 vector说到底就是一个动态数组,我们需要做的就是管理动态数组的内存,和元素的增加,删除,移动等. template <typename T> cla ...

  7. HTML:document.activeElement

    今天遇到一个很郁闷的问题: document.activeElement获取当前获得焦点的元素,在chrome总是得到body,后来经过试验得到结果如下: document.activeElement ...

  8. 开发者所需要知道的 iOS 10 SDK 新特性

    转自:https://onevcat.com/2016/06/ios-10-sdk/ 写的很好啊.哈哈哈 总览 距离 iPhone 横空出世已经过去了 9 个年头,iOS 的版本号也跨入了两位数.在我 ...

  9. 关于IIF多个条件的用法

    IIF(yyzt = 0, '生产', IIF(yyzt = 10,'入库',IIF(yyzt=20,'销售经理',IIF(yyzt=30,'用户','其他'))))

  10. docker好文收藏

    深入浅出Docker(一):Docker核心技术预览 2. 核心技术预览 Docker核心是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观.我们从虚拟化方法的四个方面:隔离性.可配额/可度 ...