如何将函数存储在变量中?
根据MDN
在JavaScript中,函数是第一类对象,因为它们可以像任何其他对象一样具有属性和方法。它们与其他对象的区别在于可以调用函数。简而言之,它们是Function个对象。
假设这个场景,
var fn = function () {};
fn.attr = 3;
console.log(fn); //prints function() {}
console.log(Object.keys(fn)); //prints ["attr"]
如果一个函数是一个对象,它不应该具有键和值类型,其中函数存储在属性中并且解释器不显示该属性?类似于C ++样式的运算符重载或Javascript本身中的数组/对象表示。我的意思是说函数(或数组)只是以不同方式处理的对象吗?这可能意味着匿名函数存储在具有隐藏属性的对象中。
总之,函数(或数组)的基础工作是什么?他们是专门治疗的吗?或者它们只是一些隐藏属性的语法糖,当使用()
时会调用它?
答案 0 :(得分:5)
是的,功能很特别。
<强>证明强>
const f = Object.create(Function.prototype);
f(); // TypeError: f is not a function
<强>博览会强>
它们是“可调用对象”,只能通过规定的语法(函数表达式,语句,声明,胖箭头,对象文字方法定义速记,Function
构造函数,class
方法)创建。
这意味着他们有一个特殊的[[Call]]
方法(对您来说不可见),当您使用()
语法调用它们时会调用它。
[[Call]]
坐标:
执行上下文的创建依次完成LexicalEnvironment
(用于作用域)的配置,配置接收器(this
)以及函数和其他元逻辑。
函数也与大多数普通对象不同,因为它们在Function.prototype
链上有[[Prototype]]
(尽管您可以通过继承Function.prototype
创建自己的'无用'对象 - 参见上文)