2014-10-05 41 views
0

我正在從codecademy獲得一個教訓,並且不理解JavaScript執行的順序。javascript是否從上到下執行?

我開始與企鵝構造:

function Penguin(name) { 
    this.name = name; 
    this.numLegs = 2; 
} 

//然後我在這裏創建一個皇帝類,並使其從企鵝

function Emperor(name) { 
this.name = name; 
} 

Emperor.prototype = new Penguin(); 

//創建一個「皇帝」對象和打印繼承它有多少腿

var me = new Emperor("John"); 

console.log(me.numLegs); 

我的問題:我的印象是,我可以定義我的目標在繼承之前,仍然控制檯記錄numLegs屬性。在創建任何「empeor」對象之前,我必須設置繼承嗎?如果是這樣,這是否意味着JavaScript從上到下讀取,因爲我聽說過不同的事情。

+0

這不是一個類。 JavaScript沒有類。它具有基於原型的對象,而不是基於類的對象。另外,我從來沒有見過這種「繼承」,但我並沒有多使用JS原型,所以可能只是我。 – 2014-10-05 01:16:44

+0

你的繼承是錯誤的。見http://blog.slaks.net/2013-09-03/traditional-inheritance-in-javascript/ – SLaks 2014-10-05 01:17:02

回答

1

Javascript語句按其出現的順序執行。

但是,函數聲明語句被提升到它們的包含範圍,所以它們的函數甚至在語句出現之前就存在。

對某個函數(例如,prototype)執行的任何語句仍按正常順序運行。

+0

但是如果我在繼承之前移動我的對象,我無法控制檯登錄me.numLegs,爲什麼那? – 2014-10-05 01:23:36

+0

@ StackOverflow421:因爲該代碼('.prototype =')尚未運行。 – SLaks 2014-10-05 01:24:55

+0

因此,唯一被提升到全局作用域的是函數聲明和變量? – 2014-10-05 01:37:16

0

是的,確實從上到下執行。 然而,函數定義(不適用於分配給變量的匿名函數)和var聲明(不是分配,只是聲明)被提升到當前範圍的頂部。 (JS映射到函數定義的範圍)。

+0

您是否介意闡述這一點以及您的任務和聲明的含義? – 2014-10-05 01:25:13

+0

如果你用'console.log(foo);'運行js文件,它會拋出一個Referrence錯誤(foo是未定義的)。如果你運行'console.log(foo); var foo = 5;',它不會拋出任何錯誤,因爲'var foo'被提升到最高。但是它會記錄'undefined',因爲只有'var foo'(聲明)會被掛起。 'console.log'後面的任務仍然會發生。 – PSkocik 2014-10-05 01:29:42

+0

吊裝的東西是一個奇怪的怪癖。海事組織,最好不要以任何方式依賴它。 – PSkocik 2014-10-05 01:31:27