2016-11-06 108 views
2

我在閱讀你不知道JS - 範圍和關閉書。說明全球範圍

它說,你不應該污染全球範圍。 fooa正在污染全球範圍。例如:

var a = 2; 
function foo() { 
    var a = 3; 
    console.log(a); // 3 
} 
foo(); 
console.log(a); //2 

這個例子中,我想出了一個圖片(學習的一部分)。

固定這個(污染),他說,包裝一個匿名函數中的代碼。

但是,我有問題說明這一點。你能幫我解決這個問題嗎?說明這一點很重要。

+1

你已經爲匿名函數的圖片,它的紅線。全局對象/變量在紅色蛋之外。 –

+0

圍繞除了紅色之外的所有內容添加一個圓圈,並將其稱爲「匿名」。 – leaf

+0

@NinaScholz我不同意,全球變量生活在全球範圍內,這是紅色的蛋。 – leaf

回答

1

我希望這有助於。這是你的例子,另外還有一個匿名函數。

var a = 2; 
 
console.log("global (start):", a); //2 
 

 
(function() { 
 
    var a = 42; 
 
    console.log("inside anonimous function (start):", a); //42 
 
    
 
    function foo() { 
 
    var a = 3; 
 
    console.log("inside foo():", a); //3 
 
    } 
 

 
    foo(); 
 
    console.log("inside anonimous function (end):", a); //42 
 
})() 
 

 
console.log("global (end):", a); //2

的圖像是不是最大的,但我希望它顯示的範圍是如何嵌套。

illustration of scopes

所以,你可以看到,每一個範圍的有它叫做a自己的變量和不接觸的休息。這是因爲每個人都使用var a來聲明它。如果省略了var部分,然後從外部範圍變量將用於

var foo = 1; 
 
console.log("global (start)", foo); 
 

 
function bar() { 
 
    console.log("inside bar(), before modification:", foo); 
 
    foo = 7; 
 
    console.log("inside bar(), after modification:", foo); 
 
} 
 

 
bar(); 
 
console.log("global (end)", foo);

enter image description here

+0

我完全意識到這些圖表有多糟糕,但我吮吸藝術。任何類型的藝術。 – vlaz

+1

謝謝你的時間,另一個問題,** a **是全球範圍的一部分,當然還有**窗口**。哪些存儲在窗口對象中?當你說,console.log(窗口),你可以深入到很多細節,對吧?哪個節點包含我的匿名函數和變量? – Meysam

+0

@Meysam首先,是的 - 如果'var a'在全局範圍內聲明,那麼它將成爲'window'對象的一部分。至於你的第二個問題 - 匿名函數將不會被分配給'window'。這是它們有用性的一部分 - 除非你自己指定一個引用,例如'var anon =(function(){/ * code * /})()',否則你將無法訪問匿名函數,但是在那個該函數必須具有返回值。此時,您正在接近[模塊模式](https://addyosmani.com/resources/essentialjsdesignpatterns/book/#modulepatternjavascript)。 – vlaz

0

由於@procrastinator建議,圍繞紅色的 'A' 和Foo並稱之爲匿名

0

你可以把它的IIFE

(function foo() { 
 
    var a = 3; 
 
    console.log(a); // 3 
 
})(); 
 

 
console.log(a)

希望這有助於

+0

問題是關於圖。 –

+0

好吧......我以爲他在問怎麼做 – Geeky