if内部函数提升时内部数据和全局数据赋值问题

if内部函数提升时内部数据和全局数据赋值问题

今天遇到一个关于if内部的函数提升的问题
百度了一下大概意思如下

从ES6开始
在严格模式下,块 里 的函数作用域为这个块。ES6之前不建议块级函数在严格模式下使用.
在ES6非严格模式下, 块中函数声明会出现提升, 所以最好使用函数表达式来定义函数
补充 :
声明式:function a(){}
表达式: var a = function(){}
个人理解就是使用声明式的话数据操作会出现一些小问题

请看如下代码:

    console.log(a) 
      if (true) {
        console.log(a) 
        a= 1
        console.log(a)
        function a() {}
        a= 2
        console.log(a) 
      }
    console.log(a)

# 预期输出为:

   undefind 函数a 1 2 2

# 实际输出为:

   undefind 函数a 1 2 1

分析

先将内部函数声明注掉:

            console.log(a) // undefinded
            if (true) {
                  console.log(a) 
                  a = 1
                  console.log(a)
                  // function a() {}
                  a= 2
                  console.log(a)
            }
            console.log(a)

#打印结果为:

  ReferenceError temp is not defined

说明if内部确实存在变量提升

断点测试

赋值为1之前:
在这里插入图片描述

可以发现 if 已经完成了变量提升,if作用域内部的 a 为函数a
而全局的a仍然为undefined

赋值为1之后:
在这里插入图片描述
if作用域内部的 a 变成了1
而全局的a仍然是undefined

运行 function a(){}之后
blog.csdnimg.cn/aa1f8c93f8324a82aa7b5571dc2c637e.png)

if内部的a = 1 赋值给了全局的a,此时都为 1

if内部赋值为2时
在这里插入图片描述

此时发现再进行赋值的话也只是对if的块级作用域内部进行修改,不会再去修改全局的a

说明if内部将1赋值给了全局的a,但是在内部函数声明之后再对全局数据的修改将不能实现,只能完成对当前块级作用域的同名变量完成修改如果想解决这个问题可以使用表达式来声明函数,使用表达式可以将函数看作一个变量

		   var a
            console.log(a) 
            if (true) {
                  console.log(a) 
                  a = 1
                  console.log(a)
                  a= function() {}
                  a = 2
                  console.log(a)
            }
            console.log(a)

# 输出为:

   undefind undefind 1 2 2
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值