!function () {}();
関数:
function () {}
何も返さない(または未定義)。
時には、作成した関数を正しく呼び出したいことがあります。あなたはこれを試してみたくなるかもしれません:
function () {}()
しかし、それはSyntaxError
になります。
関数の前に!
演算子を使用すると、式として扱われるため、次のように呼び出すことができます。
!function () {}()
!undefined
はtrue
なので、これは関数の戻り値の反対のブール値、この場合はtrue
も返します。実際の戻り値を呼び出しの結果にしたい場合は、次のようにしてください。
(function () {})()
にマークされた関数呼び出しに!
を使用するのに良い点があります airbnb JavaScriptガイド - /
後に連結される別々のファイル(別名モジュール)でこの手法を使用するための一般的なアイデア。ここでの注意点は、新しいファイルを新しい行に配置するツールによってファイルが連結されることになっているということです(いずれにせよ、ほとんどのconcatツールに共通の動作です)。その場合、!
を使用すると、以前に連結されたモジュールが末尾のセミコロンを見逃した場合のエラーを回避するのに役立ちますが、それでも心配することなく任意の順序でそれらを配置する柔軟性が得られます。
!function abc(){}();
!function bca(){}();
と同じように動作します
!function abc(){}();
(function bca(){})();
しかし、2つの文字を保存し、任意の方が良く見えます。
また、+
、-
、~
、void
のいずれの演算子でも同じ効果があります。関数を呼び出すという意味では、その関数から戻るために何かを使用する必要がある場合は、確実に異なった動作をします。
abcval = !function abc(){return true;}() // abcval equals false
bcaval = +function bca(){return true;}() // bcaval equals 1
zyxval = -function zyx(){return true;}() // zyxval equals -1
xyzval = ~function xyz(){return true;}() // your guess?
ただし、1ファイル1モジュールのコード分離にIIFEパターンを使用し、最適化のためにconcatツールを使用すると(1行1ファイルのジョブになります)、
!function abc(/*no returns*/) {}()
+function bca() {/*no returns*/}()
最初のコードサンプルと同じように、安全なコード実行を行います。
これによりエラーが発生し、JavaScript ASIはその作業を実行できなくなります。
!function abc(/*no returns*/) {}()
(function bca() {/*no returns*/})()
単項演算子についての1つの注意、彼らは同様の仕事をするでしょう、しかし念のために、彼らは最初のモジュールでは使わなかった。そのため、連結順序を完全に制御できない場合、それらはそれほど安全ではありません。
これは動作します:
!function abc(/*no returns*/) {}()
^function bca() {/*no returns*/}()
これではない:
^function abc(/*no returns*/) {}()
!function bca() {/*no returns*/}()
文がfalseと評価できるかどうかを返します。例えば:
!false // true
!true // false
!isValid() // is not valid
値をブール値に強制するために2回使用できます。
!!1 // true
!!0 // false
だから、もっと直接的にあなたの質問に答えるために:
var myVar = !function(){ return false; }(); // myVar contains true
編集: 関数宣言を関数式に変更する副作用があります。例えば。次のコードは、必須の identifier (または 関数名 )がない関数宣言として解釈されるため無効です。
function () { return false; }(); // syntax error
感嘆符を付けると、どの関数も常にブール値を返します。最終値は、関数によって返された値の否定です。
!function bool() { return false; }() // true
!function bool() { return true; }() // false
上記の例で!
を省略すると、SyntaxErrorになります。
function bool() { return true; }() // SyntaxError
ただし、これを達成するためのより良い方法は次のようになります。
(function bool() { return true; })() // true
!は論理的なNOT演算子です。これは論理を反転して反対のことをするブール演算子です。
関数の前にBANG(!)を使用して、呼び出された関数の括弧を迂回することはできますが、それでも戻り値が反転するため、望みどおりにならない可能性があります。 IEFEの場合と同様に、 undefined が返されます。これは、反転するとブール値のtrueになります。
代わりに、必要に応じて右括弧とBANG(!)を使用してください。
// I'm going to leave the closing () in all examples as invoking the function with just ! and () takes away from what's happening.
(function(){ return false; }());
=> false
!(function(){ return false; }());
=> true
!!(function(){ return false; }());
=> false
!!!(function(){ return false; }());
=> true
働く他のオペレータ...
+(function(){ return false; }());
=> 0
-(function(){ return false; }());
=> -0
~(function(){ return false; }());
=> -1
複合オペレータ...
+!(function(){ return false; }());
=> 1
-!(function(){ return false; }());
=> -1
!+(function(){ return false; }());
=> true
!-(function(){ return false; }());
=> true
~!(function(){ return false; }());
=> -2
~!!(function(){ return false; }());
=> -1
+~(function(){ return false; }());
+> -1
JavaScriptによる縮小を行うときに、1バイトのデータを保存するだけです。
以下の無名関数を考えてください
function (){}
上記を自己呼び出し機能として作成するために、一般的に上記のコードを次のように変更します。
(function (){}())
これで、関数の呼び出しに必要な(,)
を関数の末尾に追加することとは別に、2つの追加文字()
を追加しました。縮小の過程で、私たちは一般的にファイルサイズを減らすことに集中します。したがって、上記の関数を次のように書くこともできます。
!function (){}()
それでも、両方とも自己呼び出し機能であり、バイトも節約します。 2文字の(,)
の代わりに、1文字の!
を使いました。
IIFE(即時に呼び出される関数式)を書くもう一つの方法。
他の書き方 -
(function( args ) {})()
と同じ
!function ( args ) {}();
他の数バイトを節約しましょう。
(() => {})()
例:
(() => {return "yeah"})()
!
は、あなたが結果として期待しているものは何でも(反対に)否定します。
var boy = true;
undefined
boy
true
!boy
false
boy
を呼び出すと、結果はtrue
になりますが、boy
を呼び出すときに!
を追加した瞬間、つまり!boy
は、結果がfalse
になります。つまり、 NotBoy という意味ですが、今度は基本的にブール値の結果(true
またはfalse
)になります。
これは!function () {}();
式と同じことで、function () {}();
のみを実行するとエラーが発生しますが、function () {}();
式の直前に!
を追加すると、function () {}();
の逆になり、true
が返されます。例を以下に見ることができます:
function () {}();
SyntaxError: function statement requires a name
!function () {}();
true