2016-03-03 69 views
2

如果我能理解以下問題,那麼JavaScript中的對象的函數的概念就可以。我搜索了四周,看着javascript引擎試圖找到答案,但沒有任何解釋,我發現迄今爲止在我的心中...JavaScript - 作爲對象的函數

像下面的一個對象是可以理解的佈局在一個哈希映射類型的構造。

var person = { 
    firstName:"John", 
    lastName:"Doe", 
    age:50, 
    eyeColor:"blue" 
}; 

然而,要說這也是一個對象是我卡住:

var name = function() { 
    alert ('name'); 
} 
  1. 在內存方面,如何保存這個功能呢?

  2. 函數的「散列圖」中的語句是否按執行順序排列?因此,每個財產都是在另一個之後被調用的?

我可能錯過了某些東西或者看到錯誤的東西。

謝謝。

P.S

要澄清的問題2,

說我有一個,如果我的函數中的語句......那將是存儲在一個屬性進行訪問,通過它的一個屬性?

+3

爲什麼人們投票反思好的發人深省的問題?可能是因爲他們無法在其他人面前提出一個1行的答案。這是因爲這不是'請修復我的錯字'排序問題 –

+1

與C不同,沒有標準定義JavaScript的內存佈局等標準。不僅總體上沒有單個答案,在某些情況下,單個引擎可能沒有單個答案,因爲JIT可以根據使用方式對代碼進行不同的編譯和評估。在* some *的情況下,僅用作函數的函數可能僅存儲爲函數,沒有爲存儲屬性分配任何特定空間。 (這是我回避一個複雜的問題。) –

+0

函數具有屬性和方法:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function –

回答

3

javascript中的每個對象都有屬性(由字符串或符號標識的鍵值對),它具有internal slots

功能對象name以與person對象相同的格式存儲,但它們的內部插槽不同。

  • person的屬性是firstNamelastNameageeyeColor,每個保持各自的原始值
  • person的內部插槽(主要):

    • [[prototype]],指向Object.prototype
  • name的屬性是nameprototypelength(如典型地用於Function instances

  • name的內部插槽(主要):
    • [[prototype]],指向Function.prototype
    • [[ECMAScriptCode]],指向功能代碼
    • [[Environment]],指向在
    • 中創建閉合的範圍

免責聲明:這就是它唯一的行爲,引擎可以實現這不過他們想要的。儘管如此,它仍然可以作爲一個心理模型,並且瞭解對象在公共可見屬性下面有一個圖層是很重要的。

1

如果您只是想要定期進行JavaScript編碼,我認爲您不必擔心瀏覽器或服務器或其他方式如何存儲此功能。我認爲你誤解了函數的對象性質。函數內的代碼行不是哈希映射的單獨部分。相反(並且這只是開始涉及這個概念),函數可以具有名稱和值的屬性,就像常規對象可以具有這樣的屬性一樣。以下代碼演示了這一點。

var myFunc = function() { 
 
    var x = "hello".toUpperCase(); 
 
    document.write('<p>' + x + '</p>'); 
 
}; 
 

 
myFunc.favoriteColor = "red"; 
 

 
myFunc(); // runs the function and shows the text "hello" 
 
document.write("<p>" + myFunc.favoriteColor + "</p>"); // shows the text "red"

1

答案1.是:這取決於執行。

第二個問題沒有任何意義。

我認爲你正在查看語法,並假設因爲聲明數據的方式以及聲明函數的方式,函數可以被視爲語言中的數據。
事實並非如此。

有這種情況的語言。 Lisp和Prolog是最常見的例子。請參閱: https://en.wikipedia.org/wiki/Homoiconicity

+0

對不起,希望這清除了我的問題 - 說我有我的函數內的if語句...將它存儲在一個屬性可以通過其屬性之一訪問? – Brummy

+0

根據額外信息更改我的答案。 – z5h

3

函數是對象,因爲它們可以具有屬性和方法。與對象不同,它們也可以被調用並且總是返回結果。

注意,ECMAScript的(即的JavaScript)language specification描述如何Function objects應該表現而不是底層實現的,所以對象的內存中表示將取決於實現。

關於2:請注意,函數的全文可能存儲在functionBody屬性中,但函數的主體不一定是JavaScript。例如,它可以是本機代碼,對於以字符串形式返回沒有意義。

+0

當你說函數的主體不一定是JavaScript時,你是什麼意思?我將這個問題解釋爲:「描述JavaScript函數的性質......」,這意味着,根據定義,該正文是JavaScript。你指的是實現者(瀏覽器,服務器等)是否將文本或其他形式的內容存儲在內存中? –

+2

參見http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.24 - 「一個函數包含可執行代碼和狀態,用於確定它在被調用時的行爲。_函數的代碼可能會也可能不會寫在ECMAScript._「(重點是我的)。例如。像document.getElementById這樣的主機方法 - 如果你調用'.toString()'你會得到'[native code]'。 – Hamish