调用上下文和词法作用域

3
考虑以下代码。我不确定我完全理解词法作用域,但是,除非我误解了我所阅读的所有内容,否则内部函数只能引用在同一上下文中声明的外部变量。

let a = 7;

function test() {
  return a;
}

function test2() {
  let a = 5;
  return test()
}

console.log(test2())

换句话说,重要的是这些函数的诞生地,而不是它们被调用的地方。在我上面的示例代码中,“a”的变量值在test函数返回时与在test2中声明并赋值为5的“a”变量不同。就好像test2中的“a”对于test来说是一个外部变量一样。 我是否理解正确或者还有什么我没有考虑到的?

a = 5的作用域在test2()内部,而在外部则始终为7,使用let - Devsi Odedra
所以你的问题是你是否遗漏了什么?并没有。不过我不确定这是否值得点赞。 - oshell
1个回答

5

你似乎走在了正确的轨道上。

let 定义的变量只在定义它们的作用域内有效,可以是全局作用域、函数作用域或函数内部的块级作用域。函数或块中的代码可以“看到”同一函数或块内声明的变量,也可以看到外部作用域(如封闭函数或全局作用域)中的变量。

你的代码有两个不同的变量,它们碰巧共享相同的名称 a。每个let语句都会在出现的作用域内创建一个全新的变量。

因为你的两个a变量实际上是不同且不相关的变量,我们可以将它们重命名为两个不同的名称,代码仍然可以正常工作。我将使用global_a表示其中一个变量,test2_a表示另一个变量:

let global_a = 7;

function test() {
  return global_a; 
}

function test2() {
  let test2_a = 5;
  return test()
}

console.log(test2())

现在当您查看代码时,可以看到test()仅使用global_a。它甚至没有尝试使用test2_a。而在test2()函数中,您可以看到test2_a变量仅被分配但从未使用!请注意,使用var定义的变量基本上遵循相同的规则,但是函数内部块(例如带有花括号的if语句)不计算在内。var仅遵循函数作用域并忽略函数内部的块。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接