5

以下に関して、InternetExplorerとFirefoxの動作の違いを誰かが説明できますか?

var myNamespace = (function () {
  var exposed = {};

  exposed.myFunction = function myFunction () {
    return "Works!";
  }

  console.log(myFunction()); 
  // IE: "Works!"
  // Firefox: ReferenceError: myFunction is not defined

  console.log(exposed.myFunction());
  // IE: "Works!"
  // FF: "Works!"

  return exposed;
})();

console.log(myNamespace.myFunction()); 
// IE: "Works!"
// FF: "Works!"

myFunction()Internet Explorerでは、このメソッドを使用すると、またはを使用して名前空間関数内から関数を呼び出すことができますexposed.myFunction()

namepsace関数の外で使用できますmyNamespace.myFunction()

Firefoxでは、機能しない裸の名前付き関数呼び出しを除いて、結果は同じです。

それは機能するはずですか?そうすべきでない場合は、なぜですか?

もしそうなら、これは既知のバグですか?

4

3 に答える 3

6

誤った情報を防ぐには:

IEには、あなたが持っている名前付き関数式に問題があります。関数の名前は、関数内でのみ使用可能にする必要があります。仕様から:

FunctionExpressionの識別子は、FunctionExpressionFunctionBody内から参照して、関数がそれ自体を再帰的に呼び出すことができるようにすることができます。ただし、FunctionDeclarationとは異なり、FunctionExpression識別子から参照できず、FunctionExpressionを囲むスコープには影響しません。

ここで、FunctionExpressionは次のように定義されます。

FunctionExpression
     function 識別子opt ( FormalParameterList opt{ FunctionBody }

ただし、IEでは、名前を関数内でのみ使用できるようにする代わりに、2つの異なる関数オブジェクトを作成します。1つは変数に割り当てられ、もう1つは関数に付けた名前に割り当てられます。以下はfalseIEで生成されます(そして他のブラウザでエラーをスローします):

exposed.myFunction === myFunction;

これは既知のバグであり、IE(の古いバージョン)をコーディングする必要がある場合は、名前付き関数式を避ける方がよいでしょう。


関連する質問:

于 2013-02-06T15:18:35.660 に答える
2

これ:

exposed.myFunction = function myFunction () {
    return "Works!";
}

役に立たず(-自分自身を修正する:正しくない-)、明らかにバグがあります(Felixの投稿を参照)。関数の一部を宣言したい場合はexposed、名前を付ける必要はありません。

exposed.myFunction = function() {
    return "Works!";
}

ただし、ローカル関数を宣言しから配列にも影響を与える場合は、次のexposedようにすることができます。

function myFunction () {
    return "Works!";
}

exposed.myFunction = myFunction;

この場合、これは正常に検証されます(exposed.myFunction === myFunction) === true;

また、実際にはオブジェクトであるためconsole.log(myNamespace.myFunction());、への呼び出しはへの呼び出しと同じであることに注意してください。console.log(exposed.myFunction());myNamespaceexposed

于 2013-02-06T15:12:21.223 に答える
0

また、定義することによって

exposed.myFunction = function() {}

exposedプロパティをに設定していますmyFunction

myNamespaceまた、スコープでは使用できません。

定義することによって

exposed.myFunction = function myFunction() {}

関数はのスコープで作成されmyNamespace、のプロパティとして参照されますexposed

于 2013-02-06T15:19:08.877 に答える