【问题标题】:How are functions objects but not name/value pairs?函数对象而不是名称/值对如何?
【发布时间】:2014-10-09 13:22:08
【问题描述】:

在学习 javascript 时,我将对象理解为名称/值对的集合。比如直接取自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects

An object is a collection of properties, and a property is an association between a name and a value.

我知道函数也是对象。例如,我可以这样做:

function myFunc() { return "I'm a function"; }
myFunc.name = "Bob";

myFunc.name

将打印“Bob”。

然而,

myFunc

将打印

function myFunc() { return "I'm a function"; }

这不是名称/值对;这是一个功能。

如果我做了类似的事情:

var myObj = { prop1: "hello", prop2: "world" }

myObj

将打印

Object {prop1: "hello", prop2: "world"}

所以我有点困惑如何协调函数是对象和对象是名称/值对的集合,而函数不是名称/值对的集合。

【问题讨论】:

  • 请记住,对象有一个.toString() 属性,该属性控制对象如何呈现为字符串。还要记住,开发者控制台可以做任何它想做的事。函数实际上是真实的对象。对象的性质不取决于它在转换为字符串或转储到控制台时的样子。
  • 但即使忽略它在控制台中的显示方式。我仍然不明白“函数是对象,对象是名称/值对的集合”。我看不到函数 -> 名称/值对如何。
  • @mattm var foo = function() {}; foo.keyName = "value"; 这会导致foo 拥有一个具有名称/值的属性。您可以添加任意数量的属性,创建名称/值对的集合。
  • 函数是对象,但它们也是函数;它们具有超越其简单的“客观性”的内在本质。如果您将属性添加到函数,就好像它是普通对象一样,然后(例如)将其传递给迭代属性并显示其值的函数,则函数对象将看起来非常正常。当然,除了它的“对象性”之外,函数还可以作为函数调用。
  • @Pointy:“函数是对象,但它们也是函数;它们具有超越其简单的‘对象性’的内在本质”这清楚了很多。

标签: javascript function object


【解决方案1】:

我认为这是一个很好的问题。函数和对象之间的界限在其核心似乎是一个模糊的概念,但我根本不建议使用“对象是键和值的集合”的定义将函数视为对象。

您可以查看W3C objects article 和(尤其是)W3C function article 看到一个函数实际上从未被调用和对象。

我认为函数的例子很好地表明了一个对象不仅仅是“属性的集合,属性是名称和值之间的关联”,但实际上它经常是。

关于函数的对象性质,我建议的定义:

函数共享常规对象的所有特征,但它是一个非同寻常的对象,因为它可以对“()”运算符作出反应,从而评估函数的内部逻辑。

【讨论】:

    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2019-05-22
    • 2018-07-21
    相关资源
    最近更新 更多