JavaScript自我调用

时间:2011-07-26 15:17:31

标签: javascript object scope

我正在尝试使用自调用函数在javascript中构建一个对象来设置对象属性 - 类似于:

function Test() {
    this.number = 10;
    this.square = (function(test) {return test.number * test.number}(this));
}

但是当我这样做时:

var test = new Test();

console.log(test.number + " * " + test.number + " = " + test.square);
test.number = 20;
console.log(test.number + " * " + test.number + " = " + test.square);

控制台输出是:

10 * 10 = 100
20 * 20 = 100

这是为什么?有没有办法不止一次调用自调用函数? 我试图使用它来避免范围问题

5 个答案:

答案 0 :(得分:1)

自调用函数的重点是它在声明时被调用。如果你不想这样,你应该把它作为普通函数,并用test.square()调用它。

答案 1 :(得分:1)

您正在创建一个匿名函数,用于计算其参数的.number成员的quare,并使用this调用它。计算一劳永逸地完成,结果(此时this.number为10时为100)存储在self.square中。

要反映.number属性中的更改,您必须使其成为常规方法,以便根据需要计算平方。 Javascript没有属性(不是以跨浏览器的方式),隐藏方法调用并使其看起来像常规属性访问(即使这样,声明一个的语法也会不同)。

答案 2 :(得分:0)

我认为

this.square = (function(test) {return test.number * test.number}(this));

实际存储了函数调用的结果? “(这)”在声明的最后让我觉得你调用了函数,而不是将函数存储在this.square中,因为我认为你想... ...

答案 3 :(得分:0)

就像其他人所说的那样,test.square会在您实例化对象时计算一次,而不会再次计算。从你所说的,我相信你想要创建属性而不是函数,所以我会创建你的对象来接受参数。

function Test(numberArgument) {
this.number = numberArgument;
this.square = ....etc
}

答案 4 :(得分:0)

您使用的函数实际上会在创建对象时根据this.number返回静态数字。您可能希望返回一个函数,每次调用它时返回this.number的平方:

this.square = (function(test) {return function(){return test.number * test.number;}})(this);
//(this) goes outside the parentheses

您可以通过以下方式致电:

var test = new Test();
test.square();  //returns 100
test.number = 50;
test.square();  //returns 2500