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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值