1. ホーム
  2. javascript

[解決済み] JavaScriptで、(function() {})()より !function(){}() の方が優れている点は何ですか?重複

2023-06-05 15:20:42

質問

重複の可能性があります。

関数の前の感嘆符は何をするのですか?

私は長い間、JavaScriptの自己実行型無名関数に次のようなものを使ってきました。

(function () { /* magic happens */ })()

最近、次のようなパターンの例を多く見かけるようになりました(たとえば ブートストラップ ):

!function () { /* presumably the same magic happens */ }()

2番目のパターンの利点は何なのか、どなたかご存知ですか?それとも、単なる文体的な好みなのでしょうか?

どのように解決するのですか?

この2つの異なる手法には、機能的に の違い があり、外観の違いもあります。一方の技術が他方よりも優れている可能性があるのは、これらの違いによるものでしょう。

コンシジョン

Javascriptは、以下のような言語です。 コンシジョン が非常に重要になります。なぜなら、Javascriptは ページがロードされるときにダウンロードされるため . つまり、Javascriptが簡潔であればあるほど ダウンロードにかかる時間が . このため、Javascriptには ミニチュア オブファスカッター といった、Javascript ファイルを圧縮してダウンロード時間を最適化する機能を備えています。例えば alert ( "Hi" ) ; のスペースは、次のように最適化されます。 alert("Hi"); .

これを踏まえて、次の2つのパターンを比較してみましょう。

これはせいぜい微々たる最適化であり、以下のようなことをしない限り、特に説得力のある議論とは思えません。 コードゴルフ コンテストを行う場合を除き、特に説得力のある議論だと思います。

返された値を否定する

の結果値を比較する。 ab .

var a = (function(){})()
var b = !function(){}()

というのは a 関数は何も返しません。 aundefined . の否定は undefinedtrue , b は次のように評価されます。 true . これは、関数の戻り値を否定したい人、あるいは、すべてが非ヌルか未定義の値を返さなければならないというフェチにとっては有利な点です。この仕組みは、次のサイトで見ることができます。 Stack Overflow の他の質問です。

この関数宣言の背後にある理論的根拠を理解するのに役立つことを願っています。 アンチパターン .