如何分配给一个函数的成员?

时间:2012-02-01 20:35:50

标签: javascript arguments member first-class-functions

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

我是否正确地认为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 个答案:

答案 0 :(得分:1)

我将如何做到这一点:

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

var test = new something1();

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

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

JSFiddle

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

答案 2 :(得分:1)

  

我是否正确地认为arguments.callee会这样做?

是的,但现在他们deprecated了。

  

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

替换callee的官方方法是使用显式函数名称,如funcName.propertyName=...中所示。然而,这并不总是方便的,例如,动态生成的功能。引用John Resig,we're going to miss arguments.callee,它对特定任务非常有用。

答案 3 :(得分:0)

简单

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

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

修改

功能内部相同

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