Javascript范围奇怪,功能和浏览器

时间:2015-05-12 09:56:14

标签: javascript function google-chrome firefox scope

我认为这样做:

var what = function () {};

和这个

function what () {}

在JS中是一样的,因为函数应该是"第一类对象"。

今天我在Firefox中了解到这段代码:

var test = true;
if (test) {
    function what () {
      alert("foo");
    }
} else {
    function what () {
      alert("bar");
    }
}
what();

显示foo,并且因为奇怪的原因镀铬显示栏...为什么[第一]? 这样做:

var test = true, what;

    if (test) {
        what = function() {
          alert("foo");
        }
    } else {
        what = function () {
          alert("bar");
        }
    }
    what();

解决了问题..为什么[二号]? 你可以试试http://jsfiddle.net/7cbs5gr7/这里

[摘要]我有两个问题:

  1. 为什么chrome和firefox对此采取不同的行动? - 另外一个:哪一个是对的? -
  2. 为什么在var中明确设置函数解决了问题?

2 个答案:

答案 0 :(得分:3)

声明类似

的功能
what = function () {
    alert("foo");
}

function what () {
    alert("foo");
}

是两件不同的事情。

在第一种情况下,变量被提升,函数定义需要通过ifelse中的那一点传递脚本执行。在第二种情况下,该函数刚刚声明,无论ifelse中的条件如何,都可以从任何地方访问。

答案 1 :(得分:1)

  

可以使用//函数语句//(ECMA-262 Edition 3标准的允许扩展)或Function构造函数来有条件地定义函数。请注意,ES5严格不再允许此类函数语句。此外,此功能不能一致地跨浏览器工作,因此您不应该依赖它。

滚动至Conditionally defining a function