函数对象在啥时候具有属性?
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/… 请注意,使用const
或 let
声明的变量不会分配给全局对象,即使它们位于顶层以上是关于函数对象在啥时候具有属性?的主要内容,如果未能解决你的问题,请参考以下文章
使构造函数仅接受 C# 中具有 [Serializable] 属性的对象