2013-03-08 82 views
3

我正在學習JavaScript,並通過jQuery網站上的this教程。全局變量在Chrome中並不是全球性的

在下面的例子中

// A function being attached to an object at runtime 
    var myName = "the global object"; 
    var sayHello = function() 
    { 
     console.log("Hi! My name is " + this.myName); 
    }; 
    var myObject = { 
     myName: "Rebecca" 
    }; 
    var secondObject = { 
     myName: "Colin" 
    }; 

    myObject.sayHello = sayHello; 
    secondObject.sayHello = sayHello; 

    sayHello();    // "Hi! My name is the global object" 
    myObject.sayHello();  // "Hi! My name is Rebecca" 
    secondObject.sayHello(); // "Hi! My name is Colin" 

我沒有看到預期的輸出時被調用sayHello()。相反,變量是undefined。但是如果我通過將其分配給window.myName定義全局變量,它就可以工作。

我使用Chrome版本25.0.1364.152米。

是教程不正確還是我錯過了什麼?

全功能HTML是在這裏:http://pastebin.com/4M27vDB4

UPDATE:接受的答案解釋發生了什麼。我也想提一下可能的解決方案 - 在沒有var的情況下聲明全局變量。因爲以下幾點:

此外,該聲明在函數內部沒有 var關鍵字變量是不是本地的功能 - 的JavaScript會遍歷 作用域鏈一路攀升到窗口範圍,找到其中先前定義了變量 。如果該變量之前未定義爲 ,則會在全局範圍內定義,這可能會導致意外後果。

+0

適用於此(Chrome 25)。你如何運行你的代碼? – 2013-03-08 07:02:43

+0

這似乎工作正常我的Chrome 25 – 2013-03-08 07:03:16

+5

也許你已經把這個代碼放在'$(function(){...});'closure?在這種情況下,它內部的上下文不會是'window',你會得到'undefined',就像你描述的那樣。 – dfsq 2013-03-08 07:05:21

回答

4

你把這段代碼

$(document).ready(function() 
    // ... 
}); 

閉包內。在這種情況下,它不會是window(它將是document對象),您將獲得undefined正如您所描述的。

3

在您的程序中使用過this.myNamethis關鍵字用於指向當前對象。當你只撥打sayHello()那麼在這種情況下,「this」的意思是「窗口」,因爲默認當前對象是窗口。現在你還沒有定義window.myName那麼它會給「未定義」。