将属性添加到JavaScript函数是否可以接受?

时间:2013-10-09 09:01:03

标签: javascript function attributes

向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在这里 - 打开浏览器的JavaScript控制台以查看日志消息:http://jsfiddle.net/nwinkler/BwvLf/

为什么这样做?存储dummy属性的位置,以及记录函数时为什么不打印?

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

转到第15章,Native ECMAScript对象。 15.3>功能对象。

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

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

在你的情况下它应该显示“foo”。 由于它的记录非常好,你可以将它作为标准方式使用,虽然它不是那么好传播,看起来有点不寻常。

希望这有帮助。

答案 2 :(得分: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()并实际运行一些代码。函数对象更难以检查自定义附加属性的事实,结合其本机特殊对象处理(读取内置限制行为),应该给出一个提示,尽管可能附加自定义属性不是预期的属性很好地利用了一个功能对象。