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

时间:2016-08-18 13:07:57

标签: javascript lexical-scope

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

因此,根据我的理解,可以通过以下方式解释:

void fun()
{
    int x = 5;

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

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

词汇范围的概念是什么?如果是,为什么它被命名为 lxical ?究竟意味着什么?

2 个答案:

答案 0 :(得分:1)

即使您发布的代码不是JavaScript,您也基本上是正确的。 function () { … }创建范围,»内部范围«可以从»外«

访问变量
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
})();

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

function A (a) {
    var b = 100;

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

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

但是,Javascript不提供blockcope。所以:

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

变量没有“作用于”块。

ES6和新关键字let,要定义变量,请更改此设置。所以:

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

因此,在JS的未来版本中,Blockscoping也可以这样:

{
    let i = '#';
    console.log(i); //#
}
console.log(i); // ReferenceError: i is not defined

答案 1 :(得分:0)

词法范围独立于执行上下文,就像您的示例一样。

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

this.word = 'hello';
function saySomething() {
  console.log(this.word);
}

saySomething(); // "hello"

var otherContext = {
    word : "bye"
}

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