![](/img/trans.png)
[英]What is the difference between exporting a function or an object in javascript?
[英]What is the main core difference between a javascript function and javascript object?
當您對這兩種類型都執行“ typeof”操作時,您會獲得“ function”(函數)和“ object”(對象),但這不是使函數成為特殊對象,如果是的話,將函數與變量區分的屬性是什么?賓語?
當您對這兩種類型都執行“ typeof”操作時,對於函數,您將獲得“ function”;對於對象,您將獲得“ object”,
首先, typeof
的規范基本上只是一個查找表,其中說“如果值是函數對象,則返回字符串"function"
)。因此它不提供值的實際數據類型(將是功能的對象)。
但是不是嗎,所以功能是特殊的對象
是。 函數就是所謂的可調用對象。
除了“正常”屬性外,對象還具有所謂的“內部”屬性 。 您可以將它們視為某種內部狀態,需要維護該狀態才能使對象正常工作,但是在用戶代碼中不可訪問。
這些內部屬性中的某些使某些對象變得特殊,因為並非每個對象都有它們。 其中之一是[[Call]]
(內部屬性用雙括號表示),其中包含某些實現特定格式的代碼。
當您調用一個值 (即foo()
)時,解釋器首先檢查該值是否為對象,然后檢查其是否具有intern [[Call]]
屬性。 如果是,則執行存儲在該屬性中的代碼。
這是一個非常粗糙的例子,說明內部情況:
// Simulates a function call implementation, ie what happens when // you do `foo()` function call(value) { if (typeof value !== "object") { throw new Error('Not an object'); } if (!value["[[Call]]"]) { throw new Error('Not a function'); } return eval(value["[[Call]]"]); } // Simulated function object that has a name ("normal" property) // and the internal property [[Call]]. // This would be the internal representation for something like // function func() { // console.log('some code'); // } var func = { name: "func", "[[Call]]": "console.log('I\\\\'ma function!');", }; call(func);
旁注:如果您了解Python,則應該熟悉此概念,因為Python允許您通過實現__call__
來使任意對象可__call__
。
除了[[Call]]
,還有[[Construct]]
。 我們實際上區分了可調用函數和可 構造函數。 可構造函數是可以用new
調用的函數。 通過function ...
創建的function ...
既可調用又可構造。 箭頭函數僅可調用,通過class ...
創建的函數僅可構造。 根據是否設置了[[Call]]
或[[Construct]]
或兩者都進行了區分。
如果是的話,區分功能和對象的屬性是什么?
除了這些特殊的內部屬性外,函數對象還具有在Function.prototype
定義的所有屬性:
console.dir(Function.prototype);
// etc
(和Function.prototype
“擴展” Object.prototype
),這就是.call
和.apply
的定義,但這些不能單靠職能特殊。 內部的[[Call]]
屬性使它們與眾不同。
這同樣適用於其他內置的“類”,例如Array
, Date
或RegExp
。 這些類的所有實例都具有在Array.prototype
, Date.prototype
等上定義的其他方法/屬性。
函數(屬於一流對象) 可以被調用 ,而其他對象則不能。
有關更多詳細信息,請參見https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.