究竟是什么意思JavaScript中的词法范围概念?

问题描述:

我有以下疑问词法范围概念的确切含义JavaScript究竟是什么意思JavaScript中的词法范围概念?

所以,从我的理解是可以通过解释说:

void fun() 
{ 
    int x = 5; 

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

显示任何内部级可以访问它的外表水平的变量。

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

+0

词汇范围也被称为静态范围(相对于动态范围)。在动态范围内,函数可以根据其运行时上下文访问变量,在静态范围内,它只能从源代码中定义的上下文访问变量 – devnull69

+1

检查此问题: http://*.com/questions/1047454 /什么是词汇范围 –

+0

“词法范围”基本上是指“范围如书面,字面意思”。这与可能取决于*源代码布局以外因素的范围规则相反* – deceze

词法作用域独立于执行上下文,您的示例就是这种情况。执行功能,其中

的动态范围将取决于具体情况:

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

saySomething(); // "hello" 

var otherContext = { 
    word : "bye" 
} 

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

'this'是范围规则的一个不好证明,因为它确实更像是一个魔术关键字,与范围无关。 – deceze

+0

不确定要关注你能否详细说明一下? –

+0

'this'是明确传递给函数的东西(要么是你调用它的对象,要么是更明确地通过'call' /'apply')。范围是隐含地使定义的符号名称在函数内可用的东西。国际海事组织这是有点差异,因此是一个不足的例子。它不是真的可以在JS中演示动态范围,因为JS没有动态范围... – deceze

即使你已经发布的代码是不是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不提供blockscope。所以:

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