0

例子:

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?

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

4

2 回答 2

2

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

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

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

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

然后任何读取访问都obj.name将返回SomeCall().

于 2012-12-23T00:17:59.283 回答
1

JavaScript 是一种非惰性语言,所以当你将一个函数的调用编码成对另一个函数的调用时,效果就是将内部函数调用的结果传递给外部函数。

因此:

a.push(SomeCall());

实际上就像:

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

类似地,在对象字面量表达式中,属性声明的右侧被求值,求值的结果是属性的值。

于 2012-12-23T00:16:22.043 回答