1

次のコードは Firefox では正しく動作しますが、Chrome では動作しませんか? 7 行目のエラー (this.update() が見つからない) を防ぐために 15 行目をコメントアウトすると、コードは引き続き適切に実行されます。最初の定義セットが最初のものと異なる理由がわかりません。

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 に答える