![](/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.