js作用域和变量提升

104 阅读1分钟

全局作用域(在函数外部的变量)

var声明的变量,属于window对象,可以用window.xxx,let和const不属于windows对象;

局部作用域

函数作用域

var 类型的变量,可以先使用,在声明,因为js中存在变量提升。

"use strict"
a = 123;
console.log(a);
var a;

注意: 变量提升和是否严格模式是没有关系的,严格模式下也支持变量提升,上述代码就是在严格模式下进行的。 严格模式最常见的就是不能使用未定义的变量。如果上面代码没有最后一句,严格模式下会报错,非严格模式下正常。

var还可以用新的声明重置旧的变量。

var a = 123;
var a = 456;

以上两个特性,let和const不具备。 let和const类型的变量必须先声明再使用,不能用关键字声明去重置已经存在的变量。
const声明时必须赋值不能再次修改。

块级作用域

只对let和const有效。

变量提升

js引擎执行分为三个阶段,语法分析,预编译,执行三个阶段,语法分析阶段主要是检查语法错误。 js的函数声明和变量声明在js引擎预编译阶段,会提升至其所在的作用域最顶端。

console.log(a); //undefined 
var a = 123;
编译后:
var a;
console.log(a);
a = 123;
console.log(f);// function f(){},
function f(){}
编译后:
var f;
f = function f(){}
console.log(f);//注意函数提升只针对函数声明,函数表达式则按变量提升来处理。