gpt4 book ai didi

javascript - 调用上下文和词法范围

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:56:29 26 4
gpt4 key购买 nike

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

let a = 7;

function test() {
return a;
}

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

console.log(test2())

换句话说,重要的是这些函数是在哪里诞生的,而不是它们被调用的地方,在我上面的示例代码中,这意味着测试返回的变量“a”与变量“a”不同“a”在 test2 中声明并赋值为 5。就好像 test2 中的“a”对于测试来说是陌生的。我走在正确的轨道上还是有什么遗漏?

最佳答案

您似乎走在正确的轨道上。

let 定义的变量对于它们定义的任何范围都是局部的,无论是全局范围还是函数或函数内部的 block 。函数或 block 中的代码可以“看到”在同一函数或 block 中声明的变量,或外部作用域(例如封闭函数或全局作用域)中的变量。

您的代码有两个不同的变量,它们碰巧共享相同的名称,a。无论 let 语句出现在什么范围内,每个 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 定义的变量遵循基本相同的规则,除了函数内的内部 block (如带花括号的 if 语句)不算在内。 var 仅遵循函数范围并忽略函数内部的 block 。

关于javascript - 调用上下文和词法范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57320343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com