【问题标题】:Javascript function scope discrepncy between chrome and firefox, which one is correctchrome和firefox之间的Javascript函数范围差异,哪一个是正确的
【发布时间】:2015-04-10 07:34:22
【问题描述】:

我发现以下在 Chrome 和 Firefox 上执行的 Javascript 代码有不同的行为:

var outer = function (param) {
  var inner = function (theinput) {
    return theinput * 2;
  };
  return 'The result is ' + inner(param);
};

console.log(outer(2));

console.log(inner(5));

Result on Firefox:
"The result is 4"
10

Result on Chrome:
"The result is 4"
undefined

由于 inner 被声明为“var”,我猜 Chrome 上的输出是正确的,因为函数“inner”充当私有函数。我认为 Firefox 的实现是不正确的。

如果删除了inner的“var”,那么inner函数在第一次执行后就会被提升为全局函数。我的理解正确吗?

【问题讨论】:

  • 我正在使用Firefox 37.0.1,我的控制台输出如下:The result is 4ReferenceError: inner is not defined
  • 您之前是否在某处声明过inner 函数?
  • 我第一次使用不带 var 的内部运行时,因此将内部作为全局范围运行,然后运行上面的代码,其中内部带有 var(即私有)函数,然后我看到了问题。我也在使用 Fiefox 37.0.1。
  • 我在关闭火狐浏览器并再次运行上述代码后再次测试,此时我看到结果为:“结果为4”未定义。
  • 我在关闭火狐浏览器并再次运行上述代码后再次测试,此时我看到结果为:结果为4未定义。因此,看起来一旦函数在全局范围内运行,它就会一直存在,直到浏览器或控制台关闭。在现在看到相同行为的所有浏览器中检查相同。谢谢大家的澄清。

标签: javascript google-chrome firefox


【解决方案1】:

由于 inner 被声明为“var”,我猜 Chrome 上的输出是正确的,因为函数“inner”充当私有函数。我认为firefox的实现是不正确的。

都不对。由于inner 的范围在分配给outer 的函数内,因此尝试从您拥有console.log(inner(5)); 的位置访问它应该抛出ReferenceError,因为它没有被声明。

是我在 Firefox 和 Chrome 中testing your code 时得到的行为。

如果删除了inner的“var”,那么inner函数在第一次执行后就会被提升为全局函数。我的理解正确吗?

是的(除非您在严格模式下运行代码,在这种情况下,当您尝试将值分配给 inner 时会出现错误,因为您不会在任何地方拥有 var inner)。

【讨论】:

  • 我也是。 OPs 环境中可能有问题。也许他之前在没有var 的情况下进行了实验。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2019-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多