2014-01-17 46 views
0

在JavaScript的jQuery的教程(http://learn.jquery.com/javascript-101/scope/)在有關範圍下面的例子:的Javascript:前局部變量使用全局變量,使用(從jQuery的JavaScript的教程例子)

var myFunction = function() { 
    var foo = "hello"; 
    var myFn = function() { 
     console.log(foo); 
    }; 
    foo = "world"; // line x 
    return myFn; 
}; 
var f = myFunction(); 
f(); // "world" 

現在,我不知道爲什麼輸出是世界而不是你好。變量foo局部綁定在myFunction內。然後在myFn,foo被訪問。我會說評估應該在範圍內,這將在myFn內聲明,然後在內聲明myFunction,最後一個應該是全局變量。

那麼爲什麼是全局變量輸出,即使myFunction裏面的定義距離範圍較小?

如果我刪除標記爲行x的行,則會按預期輸出局部變量。

+0

'myFn'只保留'foo'對象的引用,不創建它的副本。 – Catalin

+0

含義*行x *實際上是改變myFunction的局部變量,對吧? –

+0

原型鏈不進入此代碼示例。關於這一點沒有涉及原型。我認爲你把「範圍」和封閉與「原型」混爲一談。 – meagar

回答

1

foomyFunction上下文中的局部變量。因此,當您調用myFn函數時,您正在訪問foo變量的實際值(本例中爲最後一個值)。

注意問題標題中有錯誤。 foo不是全局。但本地myFunction

+0

代碼前tuturial中的註釋是「當您在函數中引用全局變量時,該函數可以在函數定義後看到變量值的更改。」它看起來像我的評論是錯的,對吧?代碼示例中沒有全局變量。在那兒? –

+0

@mbader在你的例子中'myFunction'和'f'是唯一的全局變量。 –

+0

@mbader我認爲這是教程的措辭中的一個問題。在這個例子中,'foo'的作用域爲'myFunction'閉包。在本教程中,您在此處發佈的示例之上有一個示例,並且一個* does *包含全局'foo'變量。 –

0

函數是在Javascript中的對象和對象通過引用傳遞沒有價值。此外,返回一個對象本質上是傳遞對象。或者,你可以參考它作爲參考返回。

在全局空間中運行的myFn函數保留了它在其中定義的範圍。這就是f()遵循對foo變量所做的更改並訪問foo變量的原因。

文字的佈局在這裏有點誤導http://learn.jquery.com/javascript-101/scope/。在頁面的下方引用代碼的文本後面跟着一個冒號。您所指的文本是針對上面的代碼的,這很可能是導致混淆的原因。