関数の前に感嘆符 (!) を追加するとどうなりますか?
たとえば、次のコード:!function(){alert('iifksp')}() // true
(function(){alert('iifksp')})() // true
(function(){alert('iifksp')}()) // true
式 に変換することです。 function a(){alert('iifksp')} // undefined
function a(){alert('iifksp')}() // SyntaxError: unexpected_token
そのようなコードはこのように関数宣言と関数呼び出しを混同するためです。宣言された関数 a は a(); として呼び出す必要があります。
ただし、括弧は異なります。パーサーは関数宣言を関数宣言としてではなく、
関数式として処理するため、プログラムの実行時にのみ処理できます。関数 a が存在する場合にのみアクセスできます。 つまり、
関数宣言と関数式を明確にするメソッドはすべて、パーサーによって正しく認識されます。例: var i = function(){return 10}(); // undefined
1 && function(){return true}(); // true
1, function(){alert('iifksp')}(); // undefined
は、これが関数宣言ではなく、関数式であることをパーサーに伝えることができます。さらに、関数に対する単項演算は、曖昧さを排除するための最も早い方法であると考えることができます。戻り値を気にしない場合、これらの単項演算は有効です。
!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
http://jsperf.com/js-funcion-expression-speed
。これは、さまざまなブラウザーでアクセスし、テストを実行して結果を表示できます。結果も以下の表に示しました(私は比較的下手なので、テスト構成は少し恥ずかしいですが、仕方がない:Pentiumデュアルコア1.4G、2Gメモリ、win7 Enterprise Edition):さまざまな方法で生成されていることがわかります。結果は同一ではなく、ブラウザごとに大きく異なります。
しかし、それらの間にはまだ多くの共通点を見つけることができます:新しい方法は常に最も遅い
- これは当然のことです。他の側面の多くの違いは実際には大きな違いではありませんが、1 つ確かなことは、感嘆符は最も理想的な選択ではないということです。一方、伝統的な括弧は、テストでは常に非常に高速に実行され、ほとんどの場合、感嘆符よりも高速です。したがって、私たちが通常使用する方法に問題はなく、最適であるとさえ言えます。 プラス記号とマイナス記号は Chrome で驚くほどパフォーマンスが良く、他のブラウザでも一般に高速で、感嘆符よりもうまく機能します。 もちろん、これは単なる簡単なテストであり、問題を説明することはできません。しかし、いくつかの結論は理にかなっています。つまり、括弧とプラス記号とマイナス記号が最適であるということです。 しかし、なぜこれほど多くの開発者が感嘆符を好むのでしょうか?これは単なる習慣の問題であり、両者の有利不利は完全に無視してよいと思います。コーディング スタイルに慣れると、この規則によりプログラムがわかりにくいものから読みやすいものに変わります。感嘆符に慣れてしまえば、括弧よりも感嘆符の方が読みやすいことは認めざるを得ません。読むときに括弧の対応に注意を払う必要がなく、書くときにうっかり忘れる必要もありません -
以上がjs関数と感嘆符の関係の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。