3

向 JavaScript 函数添加属性或值是否可以接受?

例子:

var f = 1;

function foo (param) {
    f++;
}

var fooFunc = foo;

fooFunc.dummy = f;

console.log('fooFunc: ' + fooFunc);
console.log('fooFunc.dummy: ' + fooFunc.dummy);

上面的示例创建了一个函数 ( foo),然后将其分配给一个新变量 ( fooFunc),然后将一个dummy属性添加到fooFunc.

运行时,此示例首先打印函数的文本,然后打印预期值(1在本例中)。打印函数时,它不显示任何dummy值指示:

fooFunc: function foo(param) {
    f++;
}
fooFunc.dummy: 1 

JsFiddle here - 打开浏览器的 JavaScript 控制台以查看日志消息:http: //jsfiddle.net/nwinkler/BwvLf/

为什么这行得通?属性存储在哪里dummy,为什么在我记录函数时不打印?

最后,即使这可行,使用它是一个好主意(或可接受的做法)吗?我不想就此展开开放式讨论,而是想看看是否有文档使用它,或者人们在 JavaScript 编码指南中不鼓励这样做。

4

3 回答 3

3

JavaScript 中除了原语(null、undefined、number、string、boolean)之外的所有东西都是对象。所以函数基本上是对象。

JavaScript 中的对象可以具有属性和方法,因此也可以具有函数。

所有函数都继承自 Function.prototype 并具有通过此链传递的某些属性(名称、长度)和方法(.call、.apply)。

有时将属性附加到函数本身非常有用,例如缓存信息、调用次数等。以这种方式使用它并没有错。

更多细节:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function

于 2013-10-09T09:17:17.533 回答
2

让我们看一下 ECMAScript 文档(这是标准 JavaScript 所基于的)。这里是第 3 个。它的版本:

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf

转至第 15 章,原生 ECMAScript 对象。15.3 > 函数对象。

关于您的问题,有很多有趣的信息,但首先值得注意的是函数是一个对象。 作为一个对象,它具有属性(预定义并且您可以自己分配)。例如,尝试:

console.log('fooFunc.name: ' + fooFunc.name);

在您的情况下,它应该显示“foo”。由于它的文档很好,因此您可以将其用作标准方式,尽管它没有那么广泛传播并且可能看起来有点不寻常。

希望这可以帮助。

于 2013-10-09T09:18:11.813 回答
1

这是正常的对象行为,无论是否“可接受”。

通过使用 function 关键字,您实际上是在调用本机预定义的 Function() 构造函数。像任何对象构造函数一样,它在构建对象后返回一个对象。与任何对象一样,返回的对象可以具有属性,包括作为方法属性的其他函数。

var adder = function(a, b){return a+b};
adder.subtracter = function(a, b){return a-b};
console.log(adder(1,2)); // 3
console.log(adder.subtracter(1,2)); // -1

提示:如果您想查看加法器对象及其减法器方法,请在控制台中运行上述代码后从控制台视图切换到 DOM 视图,然后搜索“加法器”。您将在那里看到该对象,然后您可以折叠以查看它是由什么制成的,包括一个减法器对象。

当然,函数对象是一个特殊的原生对象,它可以像这样调用 adder() 并实际运行一些代码。一个函数对象更难检查自定义附加属性的事实,结合它的本机特殊对象处理(阅读内置限制性行为),应该给你一个提示,虽然它是可能的,但附加自定义属性不是预期的,也不是一个函数对象的好用处。

于 2013-10-09T18:02:23.310 回答