繁体   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