web-dev-qa-db-ja.com

機能の前に感嘆符は何をしますか。

!function () {}();
1140
Sebastian Otto

関数:

function () {}

何も返さない(または未定義)。

時には、作成した関数を正しく呼び出したいことがあります。あなたはこれを試してみたくなるかもしれません:

function () {}()

しかし、それはSyntaxErrorになります。

関数の前に!演算子を使用すると、式として扱われるため、次のように呼び出すことができます。

!function () {}()

!undefinedtrueなので、これは関数の戻り値の反対のブール値、この場合はtrueも返します。実際の戻り値を呼び出しの結果にしたい場合は、次のようにしてください。

(function () {})()
353
Michael Burr

にマークされた関数呼び出しに!を使用するのに良い点があります 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*/}()
53
dmi3y

文が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
28
gilly3

感嘆符を付けると、どの関数も常にブール値を返します。最終値は、関数によって返された値の否定です。

!function bool() { return false; }() // true
!function bool() { return true; }() // false

上記の例で!を省略すると、SyntaxErrorになります。

function bool() { return true; }() // SyntaxError

ただし、これを達成するためのより良い方法は次のようになります。

(function bool() { return true; })() // true
6
oozzal

は論理的な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
5
SoEzPz

JavaScriptによる縮小を行うときに、1バイトのデータを保存するだけです。

以下の無名関数を考えてください

function (){}

上記を自己呼び出し機能として作成するために、一般的に上記のコードを次のように変更します。

(function (){}())

これで、関数の呼び出しに必要な(,)を関数の末尾に追加することとは別に、2つの追加文字()を追加しました。縮小の過程で、私たちは一般的にファイルサイズを減らすことに集中します。したがって、上記の関数を次のように書くこともできます。

!function (){}()

それでも、両方とも自己呼び出し機能であり、バイトも節約します。 2文字の(,)の代わりに、1文字の!を使いました。

5
Varatharaj

IIFE(即時に呼び出される関数式)を書くもう一つの方法。

他の書き方 -

(function( args ) {})()

と同じ

!function ( args ) {}();
2
kamal

他の数バイトを節約しましょう。

(() => {})()

例:

(() => {return "yeah"})()
0
Zibri

!は、あなたが結果として期待しているものは何でも(反対に)否定します。

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
0
antzshrek