我正在尝试使用自调用函数在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
这是为什么?有没有办法不止一次调用自调用函数? 我试图使用它来避免范围问题
答案 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