为什么变量的值没有按预期显示?

why the value of variable doesn't show as expected?

在 Whosebug(或其他一些问答网站,我不确定)中有一个词汇范围的高票答案描述为

function a() {

    var x
    x = 3
    function b() {
        x = 4
    }
    function c(){
        var x
        b()
    }

    c()
    print(x)
}

一般的答案就像

if(final output is 4):
    it is lexical scope
elif(final output is 3):
    it's dynamic scope

我得出结论:

  1. 所以词法范围与在哪里调用函数无关,而是在哪里定义函数。

    如果词法范围与调用函数的位置有关: b() 在 c() 中被调用,最终输出应该是 3

  2. 普通变量都遵循词法作用域规则


以下是我的代码

let a = "before f()"

function f(){
    console.log(a) 
}

f() -->output: before f()

a = "before b() after f()"

f() -->output: before b() after f()

我的问题: 为什么第二次调用 f() 是 before b() after f(),而不是 before f()

这是我认为的过程

invoking f() the second time
go to function definition and try to find value of a
go to lexical scope where it's out and up to function definition 
find a = "before f()"

作用域决定使用哪个变量并取决于声明函数的位置。

所使用的 将是该变量的值 在您从它读取的时间(这将是函数被调用)。