究竟什么意味着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?什么意思?

  • 词汇范围也称为静态范围(与动态范围相反)。在动态范围中,函数可以根据其运行时上下文访问变量,在静态范围中,它只能从源代码中定义的上下文访问变量。
  • 检查这个问题:stackoverflow.com/questions/1047454/what-is-lexical-scope
  • "词汇范围"基本上是指"字面上写的范围",这与可能依赖于源代码布局以外的因素的范围界定规则相反。


即使您发布的代码不是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"

  • this是一个不好的范围规则演示,因为它实际上更像是一个魔术关键字,与范围无关。
  • 不一定要跟你来,你能详细解释一下吗?
  • this是显式传递给函数的东西(或者是您调用它的对象,或者更显式地通过callapply传递)。作用域隐式地使定义的符号名在函数中可用。在我看来,这有点不同,因此没有足够的例子。在JS中演示动态作用域是不可能的,因为JS没有动态作用域…
  • 嗯,好吧,谢谢。我想我得多挖点,才能真正理解这个概念。^^
  • 可以将"this"关键字与作用域混淆,因为它有时依赖于词汇上下文,但并不总是如此。它受其他因素的影响,特别是函数是否由callapply调用,以及代码是否在严格模式下运行,而scope是一个更广泛的概念,影响在哪些词汇上下文中可用。查看原始答案中的示例(标记为的副本),了解范围的解释。