1

由于函数是第一类对象,因此应该可以分配给它们的成员。

我认为这样arguments.callee做是对的吗?

还有其他方法可以设置这些字段吗?

在第一种情况下如何设置field

function something1() {
    arguments.callee.field = 12;
} 

alert(something1.field); // will show undefined
something1();
alert(something1.filed); // will show 12

something2 = function() {
    arguments.callee.field = 12;
};

alert(something2.field); // will show undefined
something2();
alert(something2.field); // will show 12

更新 1

我的意思是当它运行时如何从函数内部访问成员。

4

4 回答 4

1

这是我的做法:

function something1() {
    this.field = 12;
} 

var test = new something1();

alert(test.field); // alerts "12"
test.field = 42;
alert(test.field); // alerts "42"

如果您要将它视为一个类,则需要先创建它的一个新实例,然后才能访问它的字段。

JSFiddle

于 2012-02-01T20:39:12.940 回答
1

您不需要使用arguments.callee来引用具有名称的函数;您可以只使用名称。当您使用

function name(...) { ... }

句法; 但即使在函数表达式中,您也可以提供一个临时名称:

(function temp_name(...) { ... })(arg);

因此,如果要从函数内部设置属性,可以编写:

function something1() {
    something1.field = 12;
} 

alert(something1.field); // will show undefined
something1();
alert(something1.field); // will show 12

something2 = function something2() { // note the second "something2"
    something2.field = 12;
};

alert(something2.field); // will show undefined
something2();
alert(something2.field); // will show 12
于 2012-02-01T20:42:26.030 回答
1

我认为 arguments.callee 这样做是对的吗?

是的,确实如此,但现在他们弃用了它。

还有其他方法可以设置这些字段吗?

替换的官方方法callee是使用显式函数名,如funcName.propertyName=.... 然而,这并不总是很方便,例如,对于动态生成的函数。引用 John Resig 的话,我们将忽略 arguments.callee,它对于特定任务非常有用。

于 2012-02-01T20:59:19.973 回答
0

简单的

function something1() {};
something1.Property = "Foo";

您可以像普通对象一样直接将属性分配给任何函数。如果说在 OOP 语言中创建静态属性和方法。

编辑

函数内部相同

function something1() {
     something1.AnotherProp = "Bar";
};
something1.Property = "Foo";
于 2012-02-01T20:38:23.737 回答