0

モバイル Web サイトには、次のような JavaScript コードがいくつかあります。

<script type="text/javascript">
(function() {
  // function body omitted
}());
</script>

最初にページをロードするとコードが実行されますが、前のページに戻ってこのページを再度ロードすると、2 回目は実行されません。これは、User-Agent ヘッダーを使用して、古い Android ブラウザーにページが読み込まれた場合にのみ発生します。

Mozilla/5.0 (Linux; U; Android 2.2.1; en-gb; GT-S5570 Build/FROYO) AppleWebKit/533.1 (Gecko のような KHTML) バージョン/4.0 モバイル Safari/533.1

User-Agent ヘッダーを使用した新しい Android フォン:

Mozilla/5.0 (Linux; Android 4.2.1; Galaxy Nexus Build/JOP40D) AppleWebKit/535.19 (Gecko のような KHTML) Chrome/18.0.1025.166 Mobile Safari/535.19

ページが読み込まれるたびにコードが実行されます。これは、この古いブラウザの既知の問題ですか? 余談ですが、正確には何が違いますか

(function() {
  // function body omitted
}());

function() {
  // function body omitted
}();
4

1 に答える 1

1

少なくとも2番目の質問に答えるために、私はこのような関数式を使用している人々を見続けているので

(function () {...}())

関数には2つのタイプがあります。

  • 関数宣言
  • 関数式
  • 関数ステートメント

関数宣言を直接呼び出すことはできません。ただし、式の結果としての関数を呼び出すことはできます。

構文的に正しい即時呼び出し関数式は、次のようになります。

(function() {
  // function body omitted
})();

この場合、関数は括弧で囲んで呼び出されることで式になります。でも

(function() {
  // function body omitted
}());

グループ化演算子(が関数の周りに配置されているため、これも機能します。これにより、自動的に関数式(呼び出し可能)()になります。したがって、関数本体の直後に配置することで関数を呼び出すことができます。

しかし、これは誤解を招くような人々のようです。

function() {
  // function body omitted
}();

有効ですが、グループ化演算子が欠落しているため、インタプリタに式を通知していないため、そうではありません。したがって、それは関数宣言であり続け、直接呼び出すことはできません。

これらの3つのタイプをかなりうまく説明している素敵な記事があります

于 2013-01-08T13:00:00.393 に答える