函数对象在啥时候具有属性?

Posted

技术标签:

【中文标题】函数对象在啥时候具有属性?【英文标题】:At what point does a function object have properties?函数对象在什么时候具有属性? 【发布时间】:2019-12-31 05:57:10 【问题描述】:

函数是一流的对象,似乎它们的本地数据在某些时候必须具有属性,但我对何时/如何发生这种情况感到困惑。

举个例子:

var output = function(x)
    var s = "string";
    delete s;
    return s + " " + x;
;
console.log(output("bean"));

输出string bean。我不确定我是否希望它删除s 我只是在胡闹,因为我认为var 全局声明成为窗口对象的属性。

我知道delete 不适用于局部变量,它仅适用于对象属性。而且因为函数是对象,我想知道函数中的本地数据在什么时候成为“属性”

【问题讨论】:

阅读什么the delete operator does 【参考方案1】:

我想知道函数中的本地数据在什么时候成为“属性”

它没有。您将函数调用与与函数的普通对象类交互混淆了。

与所有对象一样,函数可以具有与其关联的任意键值属性,例如:

var fn = function(x)
  // do something
  // not important
;
fn.foo = 'foo';
console.log(fn.foo);

除非您像这样显式地为函数分配属性,否则该函数不会具有除函数通常具有的属性(如.prototype)之外的属性。

不过,将这样的任意属性分配给函数是很奇怪,并且在大多数情况下可能不应该这样做。

函数通常具有的其他属性有.name(命名函数名)、.length(指函数采用的参数数量)。

这与不能分配键值对的非对象原语相反:

'use strict';
const someStr = 'foo';
someStr.bar = 'bar';

(但是,当您尝试引用原语上的属性时,解释器会先将其包装在适当的原型中,从而将其转换为对象,以便原型继承与它一起使用)

【讨论】:

那么全局变量成为窗口对象的属性是如何工作的呢? 这是一个完全不同的问题,但基本上,事情就是这样。 ***.com/questions/55030498/… 请注意,使用 constlet 声明的变量不会分配给全局对象,即使它们位于顶层

以上是关于函数对象在啥时候具有属性?的主要内容,如果未能解决你的问题,请参考以下文章

函数表达式--总结

使构造函数仅接受 C# 中具有 [Serializable] 属性的对象

类型提示。如何暗示传递给函数的对象必须具有某种方法/属性访问权限?

JavaScript Mixin函数

76.构造函数

前端思考