Function 对象与普通对象有何不同?

2024-05-17

函数如何存储在变量中?

根据MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions

在 JavaScript 中,函数是一等对象,因为它们可以像任何其他对象一样具有属性和方法。它们与其他对象的区别在于可以调用函数。简而言之,他们是Function https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function对象。

假设这个场景,

var fn = function () {};
fn.attr = 3;

console.log(fn); //prints function() {}

console.log(Object.keys(fn)); //prints ["attr"]

如果函数是一个对象,它不应该具有键和值类型,其中函数存储在属性中并且解释器不显示该属性吗?类似于 C++ 风格的运算符重载或 Javascript 本身的数组/对象表示。我的意思是说函数(或数组)只是以不同方式处理的对象吗?这可能意味着匿名函数存储在具有隐藏属性的对象中。


总而言之,函数(或数组)的底层工作原理是什么?他们受到特殊待遇吗?或者它们只是某些隐藏属性的语法糖,当()用来?


是的,功能很特殊。

Proof

const f = Object.create(Function.prototype);
f(); // TypeError: f is not a function

博览会

它们是“可调用对象”,只能通过规定的语法(函数表达式、语句、声明、粗箭头、对象字面量方法定义简写、Function构造函数,class方法)。

这意味着他们有特殊的[[Call]]当您使用以下方法调用它们时调用的方法(对您不可见)()句法。

[[Call]]坐标:

  • 创建执行上下文(调用堆栈框架)
  • 将新的执行上下文添加到堆栈顶部
  • 函数逻辑的执行
  • 从堆栈中删除执行上下文
  • 提示下一个要运行的上下文(堆栈中紧邻的下一个上下文)
  • 向下一个执行上下文提供任何返回值

执行上下文的创建依次完成了配置LexicalEnvironment(用于范围界定),接收器的配置(this) 用于函数和其他元逻辑。

函数也不同于大多数普通对象,因为它们具有Function.prototype在他们的[[Prototype]]链(尽管您可以通过继承来创建自己的“无用”对象Function.prototype- 往上看)。

有关差异的完整列表,请参阅MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function, the spec http://www.ecma-international.org/ecma-262/6.0/ etc.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Function 对象与普通对象有何不同? 的相关文章

随机推荐