javascript - javascript 函数和 javascript 对象之间的主要核心区别是什么?

标签 javascript

当你对这两种类型执行“typeof”时,你会得到函数的“function”和对象的“object”,但这不是因为函数是特殊对象吗?如果是这样,区分a的属性是什么来自对象的函数?

最佳答案

When you do a "typeof" on both of these types you get "function" for functions and "object" for objects,

首先,the specification for typeof基本上只是一个查找表,上面写着“如果该值是一个函数对象,则返回字符串 "function"”。因此它不提供值的真实数据类型(这将成为函数的对象)。

but isn't it so that functions are special objects

是的。函数是所谓的可调用对象。

除了“正常”属性外,对象还有所谓的"internal" properties。 .您可以将这些视为某种内部状态,需要维护对象才能正常工作,但在用户代码中无法访问。

这些内部属性中的一些使某些对象变得特殊,因为并非每个对象都具有它们。其中之一是 [[Call]] (内部属性用双括号表示),其中包含一些特定于实现的格式的代码。

当您调用一个值(即foo())时,解释器首先检查该值是否是一个对象,然后检查它是否有一个内部[ [调用]] 属性。如果是,则执行存储在该属性中的代码。

这是一个非常粗略的例子,说明这在内部看起来是怎样的:

// Simulates a function call implementation, i.e. 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\\'m a function!');",
};

call(func);

旁注:如果您了解 Python,那么您应该熟悉这个概念,因为 Python 允许您通过实现 __call__ 来调用任意对象。 .

除了[[Call]]还有[[Construct]]。我们实际上区分了可调用可构造 函数。可构造的函数是那些可以用 new 调用的函数。通过 function ... 创建的函数既可调用又可构造。箭头函数只能调用,通过 class ... 创建的函数只能构造。这种区别是根据 [[Call]][[Construct]] 或两者是否设置来进行的。

if so what are the properties that differentiate a function from an object

除了这些特殊的内部属性之外,函数对象还具有定义在Function.prototype上的所有属性:

console.dir(Function.prototype);
// etc

(和 Function.prototype“扩展”Object.prototype)这是 .call.apply 已定义,但仅凭这些并不能使函数变得特殊。内部 [[Call]] 属性使它们与众不同。


这同样适用于其他内置“类”,例如 ArrayDateRegExp。这些类的所有实例都有在 Array.prototypeDate.prototype 等上定义的附加方法/属性。

关于javascript - javascript 函数和 javascript 对象之间的主要核心区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50942889/

相关文章:

javascript - 本地 href 不会在 WAMP 中进行鼠标悬停/悬停

javascript - 在 Backbone 应用程序的渲染功能上使用 addClass() 和 CSS transition 无法正常工作

javascript - 平滑滚动到 id,除非用户已经位于该位置

javascript - jqgrid setColProp 不起作用

javascript - 大数字索引的Object.keys顺序?

javascript - Node.js JSON.parse(string) 返回一个字符串

javascript - 带有两个选择/下拉字段的 MixItUp

javascript - 记录和存储鼠标移动

函数中for循环索引的Javascript范围

javascript - knex.js 中的 createTable(...).createTable(...) 和 createTable(...).then(...) 有什么区别?