8

次のように記述された Javascript の自己呼び出し関数を見てきました。

(function () {
    // foo!
})();

しかし、私はそれらが次のように書かれているのも見ました:

(function () {
    // bar!
}());

構文的には、まったく同じことを行います。私の個人的な習慣は実際には最初の形式ですが、注意すべき違いはありますか? ブラウザのねじれか何か?

たとえば、非常に些細なことの 1 つは、2 番目の形式が確実に機能する場合、次のようなことも可能であることを意味します。

function () {
    // shut the front door! saved two characters right there!
}();

ただし、読みやすさはかなり損なわれます。

4

6 に答える 6

4

初め:

ご想像のとおり、自己呼び出し無名関数の最初の2つのバージョンにはまったく違いはありません。ブラウザのクリンクや癖は、個人的な好みに帰着するものではありません(ちなみに、ダグラス・クロックフォードは後者の形式を「犬のボール」と呼んでいます)。

2番:

function() {
}()

そのステートメントは関数ステートメント/宣言を作成するため、設計上は機能しません。すぐに自分自身を呼び出すには、関数式が必要です。関数式を作成するには、複数のことを実行できます。ステートメント全体を括弧で囲むのは1つの方法ですが、次のように書くこともできます。

!function() {
}()

また

+function() {
}

これらの演算子はすべて式を作成します。

于 2012-09-06T16:58:13.813 に答える
1

最初の 2 つは同一ですが、私の記憶が正しければ、そのうちの 1 つが jsLint によって優先されます (2 つ目だと思います)。

3 番目は、ほとんどのインタープリターで構文エラーを発生させますが、他にも変種があります。

!function() {
    alert('I’m executing myself!');
}();

var noname = function() {
    alert(noname); // undefined!
}();

!+orに置き換えることができます-( クロックフォードを幸せにするものはありません )

于 2012-09-06T17:05:23.533 に答える
0

また、(function () { }());混乱を招く可能性があることに注意してください。長い機能では、注意を払っていない人が2つの閉じ括弧と、1つだけが開かれているのを見る可能性があるためです。

于 2012-09-06T17:06:59.460 に答える
0

これは主に規約の問題です。

(function () {}());<- 実行前のスタック フレームが 1 つ少ない (おそらく)

(function () {})();<- 括弧の外側で実行されるため、実行前に 1 つの小さなフレームが実行されます。このスタイルは好きではありませんが、IMO は視覚的に切り離されています。

function () {}(); <- これはただの IMO の悪い習慣です。これが慣習によるものであるIIFEであることはすぐにはわかりませんが、式の前にセミコロンを忘れると、いくつかの条件下では黙って割り当てられるという問題もあります。変数の値は未定義です。

例:

var x = 0,
    y = 1,
    z = 3,

function () {
    alert("Z is now undefined, instead of throwing a syntax error.");
}();

Andre Meinhold が述べたように、これは表現の立場ではありません。

于 2012-09-06T16:58:41.107 に答える
0

実用的に言えば、JSLint は最初の形式に文句を言い、2 番目の形式を好みます。それを超えて、それは本当に個人的な好みであり、ここでは一貫性が重要です.

3 番目の形式は SyntaxError になるため、使用できません。これは、関数式ではなく、関数宣言を作成しているためです。これは、即時関数パターンを使用するときに呼び出す関数式です。

于 2012-09-06T17:02:58.467 に答える
0

Crockfordは を使用すると述べています(function () {...}())

これは文体上の選択にすぎませんが、規約に同意することはコミュニティの利益になり、(炎上戦争を開始する危険を冒して) Crockford のものを使用しないのはなぜですか?

于 2012-09-06T17:06:31.880 に答える