1

重複の可能性:
関数の前の感嘆符は何をしますか?

だから私は戻って、自分のコードと他のJavaScriptコードのいくつかを調べていました.しばらく前にJavaScriptライブラリを書き始めたとき、次のようなクロージャを使用していたことに気付きました:

(function( window, document, undefined ) {
    // code
})( window, document );

しかし、その後、いくつかのブートストラップ コードを見て、次の構文に変更しました。

! function (window, document, undefined) {
    // code
}(window, document);

ここで、私が間違っていない場合 (間違っている場合は訂正してください)、「!」を配置します。匿名関数の前に '()' として扱われ、関数によって返された値が未定義、null、または空ではないかどうかのブール値を (どこにも?) 返します。

私が疑問に思っているのは、「()()」よりも「!()」構文を使用することに本当に違いがあるのでしょうか? 文句を言う特定のブラウザはありますか?

どんな考えでも大歓迎です、ありがとう!XD

4

2 に答える 2

1

あなたが求めているのは、IIFE(すぐに呼び出される関数式)とも呼ばれる自己呼び出し関数です。これは閉鎖とは別のものです。クロージャを作成しますが (実際には、IIFE だけでなく、javascript のすべての関数がクロージャを作成します)。

ただし、IIFE は通常、クロージャーを説明するコンテキストで導入されるため、2 つの問題を混同する可能性があることは理解できます。しかし、それらは異なるものであることに注意してください。クロージャーは、プライベートで共有される「グローバルに似た」変数です。IIFE は、定義時にすぐに呼び出される関数です。

では、IIFE はどのように機能するのでしょうか。ヒントは名前にあります。それは "FE" IIFE - 関数式です。

ご存知のように、javascript では、関数を作成する方法が 2 つあります。関数宣言を使用します。

function foo () {}

関数式の使用:

foo = function () {}

関数式は、単に式のコンテキスト*で宣言された関数です。JavaScriptの式とは何ですか? 何かを評価する単純なステートメント。

伝統的に、人々は式を次のように認識しています。

  1. =標識の右側にあるもの

     a = /* expression */
    
  2. 中括弧内の何か

    (/* expression */)
    

したがって、伝統的に、これらは関数式を宣言するための 2 つの「標準的な」方法です。

foo = function(){}

(function(){})

2 番目の構文を使用すると、式によって返される関数オブジェクトを簡単に実行できます。しかし、実際には、式は js が数学 (またはとにかく数学であるロジック) を行う場所です。したがって、関数宣言に演算子を追加すると、それも式になります。以下は単項演算子であるため機能します (つまり、左辺に何もなくても有効です)。

!function(){}()

+function(){}()

-function(){}()  // I especially like this one because it
                 // looks like a command line switch

typeof function(){}()

ただし、使い捨ての値または変数を使用する場合は、二項演算子も使用できます。以下も機能します。

x=function(){}()
0==function(){}()
1*function(){}()
2/function(){}()

一体、三項演算子を悪用することさえできます:

0?0:function(){}() // valid and works!

それについて魔法は何もありません。これは、JavaScript に焼き付けられた特定の構文ではありません。Just like(function(){}())は IIFE の特定の構文ではありません。式で宣言すると、関数はすぐに呼び出すことができるオブジェクトとして自分自身を返すだけです。

ただし、上記の非標準の形式は使用しないことをお勧めします。あなたがこの質問をしたのと同じ理由で、ほとんどの JavaScript プログラマーはそれらを見ることに慣れておらず、混乱を招く可能性があります。あなたが質問するまで、私自身はあなたがこれを行うことができるとは知りませんでした。それでも、ミニファイヤ、コード ジェネレータなどを作成する必要がある場合に知っておくと便利です。


* ここでは、仕様で定義されている「コンテキスト」の JavaScript 固有の意味ではなく、従来の定義で「コンテキスト」を使用しています。

于 2012-12-20T05:39:35.603 に答える
0

何もありません。同じことを達成するための 2 つの異なる方法にすぎません。ただし、()少し読みやすくなっています。

于 2012-12-20T05:23:05.397 に答える