我试图理解为什么在test()函数内部,var g = f不是var g = f()。警报(测试(真实))的输出是['本地'本地'] vs ['全球']警报(测试(假)),所以var g = f必须是一个声明设置g等于外部f()函数。
function f() { return "global";}
function test(x){
var g = f, result = [];
if(x){
g = function(){return "local";};
result.push(g());
}
result.push(g());
return result;
}
alert(test(false));
答案 0 :(得分:2)
var g = f
获取对全局函数f
的引用,并将该引用存储在g
中。
var g = f()
在没有参数的情况下调用f
,并在g
中存储它返回的内容。
如果您在函数中将var g = f
替换为var g = f()
,那么g
将开始包含字符串,而不是函数。当x
是真值时,这不是问题,因为在这种情况下,您无论如何都会立即将g
重新分配给函数。但如果x
是假的,那么你跳到你调用g
的行,只有你不能调用它,因为它是一个字符串而不是一个函数。
令人困惑的是符号。 当我们不编码时,通常在它们后面写一个带尾随()的函数名称,以表示它们是函数。但是我们不能在大多数编程语言中这样做,因为如果我们这样做,编译器会认为我们试图调用函数。这就是这里发生的事情。