let

JavaScript 1.7 引入

概述

声明一个块级作用域内的局部变量,可以同时进行变量的初始化.

语法

let 定义:

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

let 表达式:

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

let 语句:

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

参数

参数 描述
var1, var2, …, varN 变量名,可以是任意合法的标识符.
value1, value2, …, valueN 变量的初始值,可以是何意合法的表达式.
expression 任意合法的表达式.
statement 任意合法的语句.

描述

let可以声明一个只在所属的块级作用域内存活的局部变量.和 var 不同的是, var定义的是一个全局变量,或者是一个函数体内的局部变量.

块作用域

使用let声明的变量会被提升到当前代码块的最开始处.

使用let 在同一个块级作用域内重复定义一个变量会引起TypeError异常:

if (x) {
  let foo;
  let foo; // 抛出TypeError异常.
}

不过,函数体内没有这样的限制!

function do_something() {
  let foo;
  let foo; // 可以正常工作.
}
警告: ECMAScript 6草案 (2012.4) 规定,即使在函数体内,使用let重复声明一个变量也是不合法的. 这意味着未来的javascript会修复这个bug,抛出一个 TypeError异常. 所以你应该避免这种写法.

switch语句内,只有一个块级作用域,所以下面的写法也是不合法的.

switch (x) {
  case 0:
    let foo;
    break;
    
  case 1:
    let foo; // 抛出重复声明异常.
    break;
}

例子

let 表达式中定义的变量只在该表达式中存活.

var a = 5;
let(a = 6) alert(a); // 6
alert(a); // 5

在一个语句块中, let 定义的变量只在该语句块内存活. 而var定义的变量在整个函数体内存活.

var a = 5;
var b = 10;

if (a === 5) {
  let a = 4; // 变量a的作用域只在该if语句块内.
  var b = 1; // 变量b的作用域在该函数体内.

  console.log(a);  // 4
  console.log(b);  // 1
} 

console.log(a); // 5
console.log(b); // 1

在一个循环语句块内,你可以使用let 关键字定义一个只在循环体内存活的局部变量.

for (let i = 0; i<10; i++) {
  alert(i); // 1, 2, 3, 4 ... 9
}

alert(i); // i is not defined

相关链接

Document Tags and Contributors

Contributors to this page: ziyunfei
最后编辑者: ziyunfei,