JavaScript 函数作为对象

JavaScript Functions as Objects

我有一个关于 JavaScript 函数的问题。我阅读了 Functions as Objects,其中我们也可以向函数添加属性和方法,但是当我注销添加了 属性 的函数时,我注意到一些奇怪的行为。这是我使用对象和函数的一个小例子。

//Object Example
var obj = {
    firstName: 'John',
    lastName: 'Doe',
};
obj.address = '111 Main St. New York, NY';
console.log(obj); // Object {firstName: "John", lastName: "Doe", address: "111 Main St. New York, NY"}

//Function Example
function myFunction () {
    console.log('Hello World');
}
myFunction.greet = 'Hello JavaScript!';
console.log(myFunction); // function myFunction() { console.log('Hello World');}

正如预期的那样,'greet' 属性 已添加到 myFunction,但是当我注销 myFunction 时,我没有看到 属性 打印出来。为什么? 属性 添加到哪里了?而当我使用点运算符访问 属性 时,我看到结果注销。

有人可以解释 属性 的添加位置和存储位置吗?

您可以通过 Object.keys 函数获得自己的属性。

function myFunction () {
    console.log('Hello World');
}
myFunction.greet = 'Hello JavaScript!';

console.log(Object.keys(myFunction));

浏览器看到该变量是一个函数,因此当您注销该变量时,它会尝试以一种对开发人员有用的方式在控制台中打印它。通常我们不会将函数视为具有附加属性的东西,因此无论什么实现 console.log 都不会试图向您显示该信息。但是你从 console.log 看到的东西并没有真正与语言的实际机制联系在一起,它只是为了让开发人员更容易理解。这些属性以相同的方式存储在与其他对象相同的位置 (RAM)。