立即执行函数问题,为什么 let a 两次不会报错?

let a = 10;
function b() {
    console.log(a);
}
(function () {
    let a = 20;
    b()
})()

打印 10

请问,为什么 let a 两次不会报错

阅读 3k
4 个回答

1、函数b内部访问了变量a,而b里没有声明a,那么沿着作用域链向上找,这时就找到了上一行的a = 10这里的a
2、你要理解作用域的概念,let在同一作用域里不能重复声明,但是函数内部也是一个独立的作用域,所以a = 20a是挂载在立即执行函数的scope上的,跟外层不冲突

https://developer.mozilla.org...

let在JS中,是声明变量的符号。变量是有作用域的,简单来说,一对大括号{}内部就形成了一个作用域。
引用某个变量时,会优先从最内部的作用域去找该变量,如果最内部的作用域找不到变量,就往外看一层{},如果找到了,那么就用这一层的,如果找不到,就再往外找一层,直到最外层。
题目中,第一行let a = 10;是在最外作用域,而下面的let a = 20;是在立即执行函数的作用域里面。作用域不同,所以可以声明同名变量,不会报错。
在题目中立即执行函数中,a就是20,因为这个作用域内有声明a。在函数b中,最内部的作用域里没有声明变量a,所以就往外找一层,找到了let a = 10;,所以函数b中a值是10。

let a = 10 // 全局作用域变量a
function b() {
    console.log(a)
}
(
    function () {
        let a = 20 // 匿名函数作用域内的变量a(这个a并未使用)
        b()
    }
)()

当同一作用域内使用let声明同名变量才会报错。

跨作用域的同名不可称之为同名。

所以不报错。

因为作用域都不在同一个,你要知道每个函数内都会形成一个新的作用域,不管是不是立即执行函数

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