js笔记第四记:提升

172 阅读1分钟

参考来源:《你不知道的js》, 《js权威指南》

所有的声明(变量和函数)都会被“移动”到各自作用域的 最顶端,这个过程被称为提升。

  • 变量提升
    不管变量在哪里声明,执行的时候变量声明一定会被提升到函数体的顶部,举个例子
var scope = "global"
  function f() {
    console.log(scope)  //undefined
    var scope = "local"
    console.log(scope)  //local
  }
  f()

当函数f执行的时候,相当于

function f() {
    var scope
    console.log(scope)
    scope = "local"
    console.log(scope)
  }

当执行第一个console.log(scope)的时候,函数作用域中已有声明,就不会再通过作用域链去全局作用域中找,所以第一个输出undefined。

  • 函数提升

函数声明和变量声明都会被提升。但是一个值得注意的细节: 函数会首先被提升,然后才是变量。并且,如果有同名变量,以前的会被覆盖掉

举个例子说:

<!--第一次调用-->
foo()  //3

var foo; 
 
function foo() {
  console.log( 1 ); 
} 
 
foo = function() {
  console.log( 2 );
};

function foo() {
  console.log( 3 );
}

<!--第二次调用-->
foo() //2

浏览器就会识别为这样

<!--这个函数把之前的覆盖了,并且函数提升优先变量提升-->
function foo() {
  console.log( 3 );
}
<!--第一次调用-->
foo() // 3
<!--再次覆盖-->
foo = function() {
  console.log( 2 );
};
<!--第二次调用-->
foo()  //2

欢迎提出指正与建议