JavaScript范围和函数声明

时间:2015-06-05 16:51:15

标签: javascript scope

我试图理解为什么在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));

1 个答案:

答案 0 :(得分:2)

var g = f获取对全局函数f的引用,并将该引用存储在g中。

var g = f()在没有参数的情况下调用f,并在g中存储它返回的内容。

如果您在函数中将var g = f替换为var g = f(),那么g将开始包含字符串,而不是函数。当x是真值时,这不是问题,因为在这种情况下,您无论如何都会立即将g重新分配给函数。但如果x是假的,那么你跳到你调用g的行,只有你不能调用它,因为它是一个字符串而不是一个函数。

令人困惑的是符号。 当我们不编码时,通常在它们后面写一个带尾随()的函数名称,以表示它们是函数。但是我们不能在大多数编程语言中这样做,因为如果我们这样做,编译器会认为我们试图调用函数。这就是这里发生的事情。