js变量提升

下面有几种不同的情况,请问下各自对应的输出信息是什么?
尤其是第一个问题,是不是函数b的嵌套的函数a捕获了变量a的原因,以至于输出的信息为 123 的.有大神能帮忙分析一下吗?这个涉及变量提升和闭包的知识点.
1.

let a = 123
function b() {
    a = 456
    function a() {
      a = 789
    }
}
b()
console.log(a)

2.

let a = 123
function b() {
    a = 456
}
b()
console.log(a)

3.

let a = 123
function b() {
    var a = 456
    function a() {
      a = 789
    }
}
b()
console.log(a)

4.

let a = 123
function b() {
    a = 456
    function a() {
      var a = 789
    }
}
b()
console.log(a)
阅读 2.1k
4 个回答

第一问:b函数中的function a()是声明了一个函数

function b() {
    a = 456
    // 这里是声明一个函数
    function a() {
      a = 789
    }
}
// 相当于
function b() {
    var a
    a = 456
    function a() {
      a = 789
    }
}
// 所以外部的a的值不会改变

第二问:按顺序执行,输出456

第三问:和第一问道理是一样的,改变的只是函数b内部的a变量,不会影响外部

第四问:和第一问一样,b内部的a函数只是声明,并没有执行,所以里面的var a = 789自然也没影响

跟闭包没关系
第一个是函数作用域的原因
在函数b里函数a声明提升到函数顶部
然后函数b里的a被赋值为456 跟函数体外的没关系
所以还是123

这里不是闭包,搞清楚var和let就行了,var全局变量,是会被覆盖的,let是模块变量不会覆盖,重复定义会抛异常

除去第二个是隐式全局变量之外,其他的三个都是函数声明提升导致的,也就相当于函数 b 里面的局部变量,所以都打印的是 123.与闭包没有关系
你在函数里面打印一下 a 就清楚了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题