var foo=function(x,y){
    return x-y
}
function foo(x,y){
    return x+y
}
var num=foo(1,2)

执行代码后输出结果为:-1;

代码会被JS编译器解析成:

//variable hoisting变量提升
  var foo;//foo#1
  var num;
//function declaration hoisting函数声明提升
  function foo(x,y){//foo#2
      return x+y;
      }
//function expression NOT hoisted函数表达式不会被提升
  foo=function(x,y){//foo#3
      return x-y;
      }

变量提升规则:

1.变量,函数声明都会被提升到作用域顶处 2.当出现相同名称时 优先级为 变量声明(foo#1)<函数声明(foo#2)<变量赋值(foo#3)

函数声明提升:

定义函数有两种方法:

函数声明和函数表达式;

函数声明:

函数声明提升会在编译阶段把声明和函数体整体都提前到执行环境顶部,所以可以在函数声明之前调用这个函数;

函数表达式:

其实是变量声明的一种,声明操作会被提升到执行环境顶部,并赋值undefined,赋值处理操作因为是在执行阶段,因此编译阶段他们原地待命等待执行;

  foo(); // 100
  function foo(){
    console.log(100)
  }

  foo(); // TypeError: foo is not a function
  var foo = function(){
    console.log(100); 
  }

var foo;
foo(); // TypeError: foo is not a function
foo = function(){
    console.log(100);
}