一、let 命令
1、let命令
1.1基本用法
1.1.1 let用于声明变量
类似var,但是let声明的变量只在当前代码块内有效
{ let a = 10; var b = 1; } a // ReferenceError: a is not defined. b // 1
let命令在for 循环的计数器中很实用。
1.1.2 let不存在变量提升
var命令会发送“变量提升”,即变量可以在声明之前使用,值为undefined 正常来说变量使用一定要在声明之后。
1.1.3 暂时性死区
只要块级作用域内存在let命令,它所生命的变量就绑定(binding)这个区域,不受外部影响。
ES6明确规定,在区块中存在let 和 const命令,这个区块对这些命令声明的变量都是 不能提前使用的,会报错。
总之在代码块之内,Let声明的变量不可提前使用。
1.1.4不允许重复声明
let不允许在相同作用域内重复声明同一个变量。所以不能在函数内部重新声明参数。
function func(arg) { let arg; // 报错 } function func(arg) { { let arg; // 不报错 } }
1.1.5 ES6的块级作用域
let为JavaScript新增了块级作用域,允许块级作用域的任意嵌套。
{{{{{let insane = 'Hello World'}}}}};
外层作用域无法读取内层作用域内的变量。
{{{{ {let insane = 'Hello World'} console.log(insane); // 报错 }}}};
内层作用域可以定义外层作用域的同名变量。
{{{{ let insane = 'Hello World'; {let insane = 'Hello World'} }}}};
1.1.6 允许块级作用域中声明函数
// 浏览器的 ES6 环境 function f() { console.log('I am outside!'); } (function () { if (false) { // 重复声明一次函数f function f() { console.log('I am inside!'); } } f(); }()); // Uncaught TypeError: f is not a function
ES6的块级作用域允许声明函数的规则只在使用大括号的前提下成立,否则就会报错。
1.1.7 do表达式
块级作用域是一个语句,将多个操作封装在一起,没有返回值。
使得块级作用域可以变为表达式,也就是说可以返回值,办法就是在块级作用域之前加上do
,使它变为do
表达式。
let x = do { let t = f(); t * t + 1; };
上面代码中,变量x
会得到整个块级作用域的返回值。