1

以下代码在 Firefox 中正常工作,但在 Chrome 中不能正常工作?如果注释掉第 15 行以防止第 7 行出现错误(找不到 this.update()),代码将继续正常执行。我不明白为什么第一组定义与第一组不同。

if (typeof RegionUpdater == "undefined") {
    function RegionUpdater(param1, param2, param3) {
        this.paramA = param1;
        this.paramB = param2;
        this.paramC = param3;

        this.update();
    }

    RegionUpdater.prototype.update = function() {
        alert("hi there");
    };
}

var ru = new RegionUpdater("1", 2, "3");

function LolUpdater(param1, param2, param3) {
    this.paramA = param1;
    this.paramB = param2;
    this.paramC = param3;

    this.update();
}

LolUpdater.prototype.update = function() {
    alert("hi there");
};

var lu = new LolUpdater(1, 2, 3);

我在这里有一个 jsfiddle 设置:http: //jsfiddle.net/XhbZ8/2/

编辑:我能想出的唯一想法是 Chrome 正在进行某种推测性执行,但事实上我在 IE8 中也遇到了同样的问题,这让我不太愿意相信这种情况。

4

1 回答 1

2

首先检查为什么不同浏览器中函数声明的处理方式不同?

这似乎是一个吊装问题。该if语句被忽略,因为会发生以下情况:

if (typeof RegionUpdater === 'undefined') {
  function RegionUpdater() {}
}

上面将在下面解释,因为函数被提升(移动到)最近范围(函数)的顶部,在这种情况下,范围是全局对象。

function RegionUpdater() {}
if (typeof RegionUpdater === 'undefined') {
  // won't run since RegionUpdater is already defined
}

您可以像这样解决它:

var RegionUpdater = RegionUpdater || function RegionUpdater(){

};

编辑:就像 Mics 所说,使用函数表达式应该可以工作:

if (typeof RegionUpdater === 'undefined') {
  var RegionUpdater = function RegionUpdater(){};
  ...
}

因为它是这样发生的:

var RegionUpdater;
if (typeof RegionUpdater === 'undefined') {
  RegionUpdater = function RegionUpdater(){};
  ...
}
于 2013-07-22T07:28:43.323 回答