变量声明前置
变量声明出现在代码中的任何位置都会在该代码执行前处理,这意味着变量可以在声明之前使用。这个行为叫"hoisting",即把在指定作用域内声明的变量提升到函数或全局代码的顶部。
声明变量的作用域限制在其声明位置的上下文中,而未声明变量总是全局的,所以总在作用域最开始声明变量可以使变量的作用域变得清晰。
示例:
console.log(a); //undefined
var a=1;
console.log(b); //ReferenceError:b is not defined
- 由上到下执行代码之前,解析器会先找关键字var,找到了var a,就提升var a并将a初始化为undefined
- 再由上往下执行,读到consolo.log(a),控制台打印出来的就是undefined
- 接着给变量a赋值为1,如果这个时候后面再加一句consolo.log(a),那么控制台就会多打印出一个1
- console.log(b)的结果很好理解,因为没有声明变量b所以抛出错误
也就是说变量声明会在代码执行之前就创建、初始化并赋值undefined
注意:
提升的是var a而不是var a=1,var a=1是后面赋的值。
这也印证了:变量声明会提升,变量的赋值不会提升!!!
函数声明前置
使用function关键字可以声明一个函数,它的特征是函数声明提升,执行代码前会先读取函数声明,即函数声明不必放在调用的前面,它可以放在当前作用域的任何位置。
示例:
a();
function a(){
console.log("hello world")
};
以上代码结果如下:没有return语句就会有undefined。
js引擎有以下过程:
- 找到所有用function声明的变量,在环境中创建这些变量
- 将这些变量初始化并赋值为function(){console.log("hello world")}
- 开始执行代码a()
也就是说function声明会在代码执行之前就创建、初始化、赋值。
注意:变量声明和函数声明都会提升,函数声明提升的优先级高于变量声明提升。
示例:
console.log(a);
var a=1;
function a(){};
推荐阅读:
我用了两个月的时间才理解 let