2016-08-18 172 views
3

我有以下疑問詞法範圍概念的確切含義JavaScript究竟是什麼意思JavaScript中的詞法範圍概念?

所以,從我的理解是可以通過解釋說:

void fun() 
{ 
    int x = 5; 

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

顯示任何內部級可以訪問它的外表水平的變量。

那麼它是詞法範圍的概念?如果是,爲什麼它被命名爲lxical?究竟意味着什麼?

+0

詞彙範圍也被稱爲靜態範圍(相對於動態範圍)。在動態範圍內,函數可以根據其運行時上下文訪問變量,在靜態範圍內,它只能從源代碼中定義的上下文訪問變量 – devnull69

+1

檢查此問題: http://stackoverflow.com/questions/1047454 /什麼是詞彙範圍 –

+0

「詞法範圍」基本上是指「範圍如書面,字面意思」。這與可能取決於*源代碼佈局以外因素的範圍規則相反* – deceze

回答

1

詞法作用域獨立於執行上下文,您的示例就是這種情況。執行功能,其中

的動態範圍將取決於具體情況:

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

0

即使你已經發布的代碼是不是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 
相關問題