let a = 10;
function b() {
console.log(a);
}
(function () {
let a = 20;
b()
})()
打印 10
请问,为什么 let a 两次不会报错
let a = 10;
function b() {
console.log(a);
}
(function () {
let a = 20;
b()
})()
打印 10
请问,为什么 let a 两次不会报错
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()
}
)()
跨作用域的同名不可称之为同名。
所以不报错。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
1、函数
b
内部访问了变量a
,而b
里没有声明a
,那么沿着作用域链向上找,这时就找到了上一行的a = 10
这里的a
2、你要理解作用域的概念,
let
在同一作用域里不能重复声明,但是函数内部也是一个独立的作用域,所以a = 20
的a
是挂载在立即执行函数的scope上的,跟外层不冲突https://developer.mozilla.org...