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

时间:2018-04-02 12:03:14

标签: javascript lexical-scope

StackOverflow(或其他一些q& a网站,我不确定)描述为词汇范围的高投票答案

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. 正常变量都遵循词法范围规则

  3. 以下是我的代码

    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()"
    

1 个答案:

答案 0 :(得分:3)

范围确定使用哪个变量,并取决于声明函数的位置。

使用的将是您从中读取时的变量的值(将在调用该函数时)。