【问题标题】: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 不适用于局部变量,它仅适用于对象属性。而且因为函数是对象,我想知道函数中的本地数据在什么时候成为“属性”

【问题讨论】:

标签: javascript function


【解决方案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';

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

【讨论】:

  • 那么全局变量成为窗口对象的属性是如何工作的呢?
  • 这是一个完全不同的问题,但基本上,事情就是这样。 stackoverflow.com/questions/55030498/… 请注意,使用 const 或 let 声明的变量不会分配给全局对象,即使它们位于顶层
猜你喜欢
  • 1970-01-01
  • 2020-04-07
  • 2012-02-03
  • 1970-01-01
  • 2021-11-12
  • 2011-06-15
  • 1970-01-01
  • 2020-11-05
  • 2017-09-23
相关资源
最近更新 更多