跳到主要内容

变量

一、var


1.1 var 声明可以省略

虽然可以通过省略var 操作符定义全局变量,但不推荐这么做。在局部作用域中定义的全局变量很难维护,也会造成困惑。这是因为不能一下子断定省略var 是不是有意而为之。在严格模式下,如果像这样给未声明的变量赋值,则会导致抛出ReferenceError 。

变量在全局,省略声明则为全局变量
code = 200;
console.log(window.code); // 200
变量在函数体内,省略声明则为全局变量
function foo(){
code = 200;
}

foo();
console.log(window.code); // 200

1.2 var 具有变量提升

V8 引擎将执行JavaScript代码的过程分为编译执行两个阶段。在编译阶段,如果解析到了某个变量声明,将其放到作用域中,将其值设为undefined,表示该变量还未使用。我们把这种在编译阶段,将所有的变量提升到作用域的过程称为变量提升。在执行阶段,如果使用了某个变量,就可以直接去作用域中去查找。

1.3 var 可以重复声明

1.4 var 没有块级作用域

1.5 var 声明的变量会在 window 上添加一个属性

每一个执行上下文会关联到一个变量环境,在执行代码中变量和函数的声明会作为环境记录添加到变量环境中。对于函数来说,参数也会被作为环境记录添加到变量环境中。

二、let


2.1 let 没有变量提升

let声明的变量会被创建在包含他们的词法环境被实例化时,但是是不可以访问它们的,直到词法绑定被求值。不可以访问的这段时间称为暂时性死区

2.2 let 不可以重复声明

2.3 let 具有块级作用域

2.4 let 声明的变量不会在 window 上添加一个属性

每一个执行上下文会关联到一个变量环境,在执行代码中变量和函数的声明会作为环境记录添加到变量环境中。对于函数来说,参数也会被作为环境记录添加到变量环境中。

三、const


3.1 const 没有变量提升

const声明的变量会被创建在包含他们的词法环境被实例化时,但是是不可以访问它们的,直到词法绑定被求值。不可以访问的这段时间称为暂时性死区

3.2 const 不可以重复声明

3.3 const 具有块级作用域

3.4 const 声明的变量不会在 window 上添加一个属性

每一个执行上下文会关联到一个变量环境,在执行代码中变量和函数的声明会作为环境记录添加到变量环境中。对于函数来说,参数也会被作为环境记录添加到变量环境中。

3.5 const 声明变量时必须同时初始化变量,且尝试修改const 声明的变量会导致运行时错误

const声明的限制只适用于它指向的变量的引用。换句话说,如果const变量引用的是一个对象,那么修改这个对象内部的属性并不违反const的限制。