考虑下面的代码段
导出类型为功能。但我们仍然可以拥有exports.hello
财产。怎么可能?
const obj = {
exports: {}
}
obj.exports = () => {
console.log('invoked')
}
obj.exports.hello = () => {
console.log('hello() invoked')
}
var output = `type of obj => ${typeof obj} ####
type of obj.exports => ${typeof obj.exports} ####
obj.exporst.hello() is ${typeof obj.exports.hello}
`;
console.log(output);
输出结果为:
type of obj => object #### type of obj.exports => function #### obj.exporst.hello() is function
拥有exports
对象(typeof 'object'
)并具有exports.hello
,exports.foo
等函数是合乎逻辑的。但是我们如何将导出本身作为函数和然后有出口的属性?
答案 0 :(得分:2)
功能是对象。你可以对一个对象做任何事情,你可以做一个函数。
答案 1 :(得分:2)
在JavaScript中,函数是
first-class objects
,因为它们可以 拥有与任何其他object
一样的属性和方法。什么 将它们与其他objects
区别开来是可以调用函数。 简而言之,它们是Function
个对象。
这足以解释为什么你可以拥有一个函数的属性
检查 this link 有关函数对象的属性和方法
总结MDN文档的状态
全局
Function object
没有自己的方法或属性。 但是,由于它本身就是一个函数,它确实继承了一些方法 来自Function.prototype
的原型链中的属性和属性。
简而言之function is an instance of an Object
function myName() {
console.log('myName')
}
console.log(myName instanceof Object);
答案 2 :(得分:1)
JavaScript是高度动态类型的语言,因此这种行为并不令人惊讶。只需将JavaScript函数视为可以调用的对象。