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

两个简单的例子

  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早于其他普通变量;
  • 函数表达式 定义的函数不存在变量提升,只会在执行的时候运行。函数声明才存在变量声明。

转载于:https://juejin.im/post/5cf61bddf265da1b7b31770c

猜你喜欢

转载自blog.csdn.net/weixin_34067980/article/details/91467214
今日推荐