函数提升和变量提升,以及他们的优先级

***一、变量提升
在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域。变量提升即将变量声明提升到它所在作用域的最开始的部分。

(1) 创建函数有两种形式,一种是函数声明,另外一种是函数字面量,**只有函数声明才有变量提升** ``` console.log(a) // f a() { console.log(a) } console.log(b) //undefined function a() { console.log(a) } var b = function(){ console.log(b) } ```

相当于
var a = 'function' var b console.log(a) console.log(b)

(2)变量提升 ``` console.log(c); //undefined var c = "第一次没打印出来,第二次才出来"; console.log(c); //第一次没打印出来,第二次才出来 function fn(){ console.log(d); //undefined var d = '和前面的一样啊'; console.log(d); //和前面的一样啊 } fn(); ``` 其实,就相当于 ``` var c ; console.log(c) c = " xxxx " console.log(c) ```

***二、函数提升与变量提升的优先级

``` console.log(a); // f a() {console.log(10)} console.log(a()); // undefined var a = 3; function a() { console.log(10) //10 } console.log(a) //3 a = 6; console.log(a()); //a is not a function; ``` 原理 : ``` var a = funtion () { console.log(10) } var a; console.log(a); // f a() {console.log(10)} console.log(a()); // undefined a = 3; console.log(a) //3 a = 6; console.log(a()); //a() is not a function; ``` 由此可见函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfxzg.html