共计 1147 个字符,预计需要花费 3 分钟才能阅读完成。
一 什么是?
概括:简略说就是在 js 代码执行前引擎会先进行预编译,预编译期间会将变量申明与函数申明晋升至其对应作用域的最顶端。
-
变量晋升:
全局作用域中申明的变量会晋升至全局最顶层,函数内申明的变量只会晋升至该函数作用域最顶层。function variableUp() {if (!foo) {var foo = 5;} console.log(foo); // 5 } variableUp(); -
函数晋升:
函数晋升只会晋升函数申明,而不会晋升函数表达式,定义形参就相当于在函数作用域中申明了变量function funUp(a) {conosle.log(a)//output: undefined function foo() {console.log(1); } foo(); // output: 2 function foo() {console.log(2); } } funUp() var funUp=function(){console.log(funUp) } 在 JavaScript 中的函数是一等公民,函数申明的优先级最高,会被晋升至以后作用域最顶端
二 对于变量晋升及函数晋升的了解
三 实际例题
题目:
function fn(a,c){console.log(a) //output: function a(){} | |
var a=123 | |
console.log(a) //output: 123 | |
console.log(c) //output: function c(){} | |
function a(){} | |
if(false){var d =678} | |
console.log(d) //output: undefined | |
console.log(b) //output: undefined | |
var b = function(){} | |
console.log(b) //output: function | |
function c(){} | |
console.log(c) //output: function c | |
} | |
fn(1,2) |
剖析:
oa={ | |
a:undefined,//1, function, 123 | |
c:undefined,//2, function | |
d:undefined, | |
b:undefined, //function | |
} |
js 中无论哪种模式申明 (var, let, const, function, function, class) 都会存在晋升景象,不同的是,(var,function,function)的申明会在晋升时进行初始化赋值为 undefined,因而拜访这些变量的时候,不会报 ReferenceError 异样,
应用 let,const,class 申明的变量,
被晋升后不会被初始化,此时如果拜访这些变量会抛出 ReferenceError 异样,看上去就像没被晋升一样
结束语:无论是晚期的代码,还是 ES6 中的代码,咱们都须要遵循一点,先申明,后应用。
正文完
发表至: javascript
2021-10-27