Javascript中的函数声明与函数表达式

356 阅读1分钟

两个简单的例子

  1. 请思考下面两段代码的输出结果
    add() // 0
    function add () {
      return '函数声明'
    }
    add () // add is not a function
    var add = function () {
        return '函数表达式'
    }

以上两个例子中,第一段代码中函数声明式add存在变量提升,实际上的执行顺序为:

 var add
 add()
   function add () {
     return '函数声明'
   }

很好奇的是为什么同样都是函数,第二段函数表达式中似乎没有进行函数变量提升,再看一个例子:

  var add = function () {
    return 1
  }
  add() // 1

实际上,函数表达式定义后,并不会进行变量提升,只是会在执行的时候运行,所以才会出现此种情况。

  1. 再来看一段代码
 var add = function () {
   return 0
 }
 function add () {
   return 1
 }
 add() // 0

这里实际上也是存在变量提升的,只不过是两种类型的提升,一种是var变量提升,一种是function提升,在运行之前,会提前生成执行上下文,执行上下文解析的规则则是:function早于var被提升,所以上例就很好理解了,是因为变量add覆盖了函数add。

总结了以下几点:

  • 在执行上下文中存在变量提升,变量提升又分为普通变量提升与function提升,function早于其他普通变量;
  • 函数表达式 定义的函数不存在变量提升,只会在执行的时候运行。函数声明才存在变量声明。