JavaScriptの中でfunction(){}の前に感嘆符の作用をプラスします.


jsライブラリを使っているうちに、彼らのコードの中には次のようなものがたくさんあることが偶然発見されました.
!function ($) {
    //do sth
}(window.jQuery);
そこで試してみました.
!function(){alert('iifksp')}()        // true
はコンソールの運転後に得られた値の時trueです.なぜtrueなのかは分かりやすいです.この匿名関数は戻り値がないため、デフォルトではundefinedに戻ります.逆を求める結果は自然にtrueです.したがって、問題は結果の値ではなく、なぜ反作用が匿名関数の自己変調を合法化することができるのかということです.
function($){}これは関数の声明です.直ちに実行させる必要があるときは、演算子を使って関数を呼び出す必要がありますが、演算子は前の表現を必要とします.通常は、丸括弧を使って匿名関数宣言を式に変換します.だから、私たちは通常こう書きます.
(function(){alert('iifksp')})()        // true
(function(){alert('iifksp')}())        // true
上記の2つの括弧の位置は違っていますが、効果は全く同じです.
このような感嘆符の仕方に対して、多くの人が夢中になっているメリットは何ですか?文字を節約するためだけにはあまり必要がないので、100 Kのライブラリを作ってもあまりスペースが節約できないかもしれません.空間ではないなら、まだ時間があるかもしれません.事実ははっきりしないです.文章の最後に性能について言及します.
核心に戻って、なぜこのようにすることができますか?さらに核心的な問題は、なぜこうしなければならないのですか?
括弧にしても、感嘆符にしても、文全体を合法的にすることは一つしかないです.関数ステートメント文を一つの表現に変えました.
function a(){alert('iifksp')}        // undefined
これは関数宣言です.このような声明の後に直接括弧で呼び出すと、解析器は当然理解できず、エラーを報告します.
function a(){alert('iifksp')}()        // SyntaxError: unexpected_token
は、このようなコードが関数宣言と関数呼び出しを混同しているため、このように宣言する関数aは、a()であるべきである.の方式で呼び出します
しかし、括弧は違っていて、関数宣言を式に変換しました.解析器は関数宣言の方式で関数aを処理するのではなく、関数式として処理します.したがって、プログラムが関数aに実行される時だけアクセスできます.
したがって、任意の消去関数宣言と関数表現間の曖昧性の方法は、解析器によって正確に識別されることができる.たとえば:
var i = function(){return 10}();        // undefined
1 && function(){return true}();        // true
1, function(){alert('iifksp')}();        // undefined
は値を割り当てて、論理、甚だしきに至ってはコンマ、各種のオペレータはすべて解像器に教えることができて、これは関数の声明ではありませんて、それは関数の表現です.どうしてこのようにすることができますか?操作子の優先度は2段階高くなります.[参照].また、関数の1元演算を計算すると、曖昧さを解消する一番早い方法です.感嘆符はその中の一つです.戻り値を気にしないなら、これらの1元演算は有効です.
!function(){alert('iifksp')}()        // true
+function(){alert('iifksp')}()        // NaN
-function(){alert('iifksp')}()        // NaN
~function(){alert('iifksp')}()        // -1
または以下のようなキーワードは、よく働くことができます.
void function(){alert('iifksp')}()        // undefined
new function(){alert('iifksp')}()        // Object
delete function(){alert('iifksp')}()        // true
最後に、括弧でしたことも同じです.曖昧さをなくすのは本当に仕事です.関数を一つの全体としてではなく、括弧が声明に含まれていても関数全体を中に含めても合法です.
(function(){alert('iifksp')})()        // undefined
(function(){alert('iifksp')}())        // undefined
は、これだけ多くのことを言っていますが、実際には、いくつかのことを言っているのは、最も基本的な概念である語句、表現文、演算子優先度であり、これらの概念は、ポインタとポインタ変数のように紛らわしいです.このような混淆はプログラミングに対して特徴付ける影響がありませんが、邪魔者の石はいつでもそのために血が流れます.
ソース:functionと感嘆符
         JavaScriptの中でfunction(){}の前に感嘆符の作用をプラスします.