簡體   English   中英

javascript函數和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]]屬性使它們與眾不同。


這同樣適用於其他內置的“類”,例如ArrayDateRegExp 這些類的所有實例都具有在Array.prototypeDate.prototype等上定義的其他方法/屬性。

函數(屬於一流對象) 可以被調用 ,而其他對象則不能。

有關更多詳細信息,請參見https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM