示例:
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?
现在当我访问对象的值或数组中的项时,它是否在那时调用函数并给出值?或者它是在推/赋值时调用函数并保持返回值?
答案 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);
类似地,在对象文字表达式中,评估属性声明的右侧,并且评估的结果是属性的值。