究竟什么意味着JavaScript中的词法范围概念?

What exactly means the lexical scope concept in JavaScript?

本问题已经有最佳答案,请猛点这里访问。

我对javascript中词汇范围概念的确切含义有以下疑问。

因此,根据我所理解的,它可以解释为:

1
2
3
4
5
6
7
8
9
void fun()
{
    int x = 5;

    void fun2()
    {
        printf("%d", x);
    }
}

显示任何内部级别都可以访问其外部级别变量。

那么它是词汇范围的概念吗?如果是,为什么叫Lxical?什么意思?


即使您发布的代码不是Javascript,您基本上是对的。一个function () { … }创建了一个范围,并且?内部范围?可以从访问变量吗?外部?

1
2
3
4
5
6
7
8
9
10
11
12
13
var a = 10, b = 20;

(function () {
    var b = 100;
    console.log(a); //10
    console.log(b); //100

    (function() {
        var c = 333;
    })();

    console.log(c) //undefined
})();

值得注意的是,范围(函数是在其中定义的)与函数一起保存。这意味着:

1
2
3
4
5
6
7
8
9
10
function A (a) {
    var b = 100;

    return function (c) {
        console.log(a, b, c);
    }
}

var afx = A(10);
afx(666); //10, 100, 666;

但是,javascript不提供BlockScope。所以:

1
2
for (var i = 0; i < 10; i++) {}
console.log(i) //9

变量不是?作用域?到街区。

但是ES6和新的关键字let定义变量时,要改变这个。所以:

1
2
for (let i = 0; i < 10; i++) {}
console.log(i); // ReferenceError: i is not defined (using babel to transpile)

因此,在未来的JS版本中,也可以这样进行阻塞作用域:

1
2
3
4
5
{
    let i = '#';
    console.log(i); //#
}
console.log(i); // ReferenceError: i is not defined

词汇范围独立于执行上下文,您的示例就是这样。

动态范围将取决于执行函数的上下文:

1
2
3
4
5
6
7
8
9
10
11
12
this.word = 'hello';
function saySomething() {
  console.log(this.word);
}

saySomething(); //"hello"

var otherContext = {
    word :"bye"
}

saySomething.call(otherContext); //"bye"