let命令
- let只作用在所在的代码块内
{
var a = 1;
let b = 2;
}
a; //1
b; //进行报错
通过let声明的变量b只作用在大括号内,在括号外调用变量b时则会进行报错;
通过var声明的变量在全局中都有效
- let不存在变量提升,变量的使用前需要先进行定义
{
console.log(foo); //输出undefined
var foo = 1;
console.log(goo); //抛出错误
let goo = 2;
}
通过var声明的变量可以在声明前使用
通过let声明的变量不能在声明前使用
在编写代码的过程中尽量先声明再使用
暂时性死区
在let声明变量之前的代码称为变量goo的暂时性死区,结束的位置即let声明的代码区;
其本质是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
- 不允许重复声明
{
function foo(arg){
var a = 1;
let a = 2; //报错
let arg = "hello world !"; //报错
{
let arg = "i 'am happy !"; //与arg不再统一作用域内,正确
}
}
}
只有在相同作用域内重复声明时会出现报错
块级作用域
在块级作用域中对函数声明相当于let语句,在作用域之外不能调用该函数;
对于es6的浏览器,在块级作用域中声明的函数行为相当于var,会提升到全局作用域中
如果需要在块级作用域中定义函数,则应使用函数表达式
// 函数声明语句
{
function f() {
let a = 1;
return a;
};
}
// 函数表达式
{
let f = function () {
let a = 2;
return a;
};
}
do
块级作用域是一个语句,没有返回值,在块级作用域前加上do将其转换为表达式
{
let t = f();
t * t + 1;
//大括号外无法得到t的值
}
let x = do {
let t = f();
t * t + 1;
}; //x为大括号内获得的t值
const命令——声明只读变量
- 使用const声明的变量不能修改变量的值,并且不能只声明不赋值
{
const PI = 3.14;
PI = 3; //报错
const h; //报错
}
- 存在暂时性死区
- 只在所在的作用域内有效
- 不能重复声明
本质:
const定义的变量不可改动是指变量所指向的地址不可改动;简单类型的数据,值就保存在变量所指向的地址中;复合类型的数据,变量即一个指针,所指向的数据结构是可变化
{
const a = [];
a.push('hello world !'); //正确
const foo = {};
foo.a = 2;
foo = {"hello world ! "}; //改变了变量foo的指向关系,将会报错
}
可使用Object.freeze方法进行对对象的冻结
{
const foo = Object.freeze({});
foo.a = 2;
foo = {"hello world ! "}; //严格模式下报错
}
声明变量的方法
- 六种:let、 const、 var、 function、 import、 class
网友评论