如果我将一个函数调用推入一个数组或作为属性赋值它是否推送/分配返回的值?

时间:2012-12-23 00:13:49

标签: javascript arrays function object

示例:

function SomeCall(){
      return "Bill";
}

var a = [];
a.push(SomeCall());

var obj = {
      name: SomeCall()
};

//is function CALLED here or does this already contain "Bill"?
console.log(obj.name); 
console.log(a[0]); //what about here?

现在当我访问对象的值或数组中的项时,它是否在那时调用函数并给出值?或者它是在推/赋值时调用函数并保持返回值?

2 个答案:

答案 0 :(得分:2)

使用()时,该函数被调用。因此数组包含函数的返回值。如果您想存储函数本身,只需使用a.push(SomeCall)并稍后调用它(a[0]())。如果您总是想用某些参数调用它,请存储一个包含该调用的匿名函数:

a.push(function() {
    return SomeCall(your, params);
});

但是,在现代JS引擎中(即不在“旧”IE版本中),您可以定义访问者。这允许您在读取(或写入)某个属性时执行代码:

var obj = {};
obj.__defineGetter__("name", SomeCall);

然后对obj.name的任何读取权限都会返回SomeCall()的结果。

答案 1 :(得分:1)

JavaScript是一种非惰性语言,因此当您将对函数的调用编码为对另一个函数的调用时,效果是内部函数调用的结果被传递给外部功能

因此:

a.push(SomeCall());

实际上就像:

var temp = SomeCall(); // call function, get result
a.push(temp);

类似地,在对象文字表达式中,评估属性声明的右侧,并且评估的结果是属性的值。