Function对象与Normal对象有何不同?

Tar*_*nti 4 javascript interpreter

函数如何存储在变量中?

MDN称

在JavaScript中,函数是第一类对象,因为它们可以像任何其他对象一样具有属性和方法.它们与其他对象的区别在于可以调用函数.简而言之,它们是Function对象.

假设这个场景,

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

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

console.log(Object.keys(fn)); //prints ["attr"]
Run Code Online (Sandbox Code Playgroud)

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


总之,函数(或数组)的基础工作是什么?他们是专门治疗的吗?或者它们只是一些隐藏属性的语法糖,在()使用时会被调用?

Ben*_*Ben 5

是的,功能很特别.

证明

const f = Object.create(Function.prototype);
f(); // TypeError: f is not a function
Run Code Online (Sandbox Code Playgroud)

解释

它们是"可调用对象",只能通过规定的语法(函数表达式,语句,声明,胖箭头,对象文字方法定义速记,Function构造函数,class方法)创建.

这意味着他们有一个特殊的[[Call]]方法(对你来说不可见),当你用()语法调用它们时会调用它们.

[[Call]] 坐标:

  • 创建执行上下文(call-stack frame)
  • 将新的执行上下文添加到堆栈顶部
  • 执行功能逻辑
  • 从堆栈中删除执行上下文
  • 提示下一个要运行的上下文(堆栈中的下一个上下文)
  • 将任何返回值提供给下一个执行上下文

执行上下文的创建依次完成LexicalEnvironment(用于作用域)的配置,this用于函数和其他元逻辑的接收器()的配置.

函数也与大多数普通对象的不同之处在于它们Function.prototype[[Prototype]]链上(尽管您可以通过继承来创建自己的'无用'对象Function.prototype- 参见上文).

有关差异的完整列表,请参阅MDN,规范等.

  • - 缓慢的鼓掌 - 天啊,这是一个很好的答案. (2认同)
  • 对象也不是特殊的,因为它们只能通过规定的语法(对象文字,`new`调用,`Object`函数)创建? (2认同)