2017-06-15 67 views
0

我正在學習Javascript,並且有此問題。下面是一些示例代碼:JavaScript:訪問嵌套函數中的中/外函數的變量/屬性

var xq = false; 
 
var fooyy = function ttt() { 
 
    var xq = false; 
 
    baryy = function() { 
 
    var xq = true; 
 
    console.log(xq); 
 
    console.log(ttt); 
 
    console.log(fooyy); 
 
    console.log(ttt.xq); 
 
    console.log(fooyy.xq); 
 
    console.log(window.xq); 
 
    }(); 
 
}; 
 

 
fooyy(); 
 
console.log(xq); 
 
console.log(fooyy.xq);

望着輸出,我的問題是,這樣豈不是從內部嵌套功能,外部功能性和變量不能被訪問(無論是同名還是其他)?或者如果他們可以,你能解釋如何和爲什麼? (我看到本地和全局變量都可以訪問)謝謝!

+3

請參閱[閉包](https://developer.mozilla.org/en/docs/Web/JavaScript/Closures) – James

回答

1

是否意味着從內部嵌套函數中,不能訪問外部函數的屬性和變量?

不。那些不是屬性,它們是變量。您試圖將它們作爲不存在的函數的屬性進行訪問。

我看到局部和全局變量都可以訪問。關於外部函數的變量(在具有相同名稱和其他情況下)呢?

只要它們具有不同的名稱,就可以訪問它們。這被稱爲lexical scope,並且即使在外部函數已經返回之後也可以工作 - 內部函數將形成closure。你可以通過他們的名字簡單地訪問它們,它們是局部變量。

如果然而具有相同名稱的本地作用域的變量,就像在你的榜樣變量xq,該局部變量將陰影從外部範圍的變量,並使其無法訪問。如果你想訪問它,你需要重命名任何變量。

0

你在那裏有一個closure,很好地在這SO question解釋。

此外,請看這個SO question,在那裏人們投入了大量的努力來解釋什麼是閉包。

總之,baryy函數可以訪問外部變量。