JavaScriptは他のプログラミング言語と比較してよりカジュアルであるため、JavaScriptコードにはあらゆる種類の奇妙な書き込み方法がたくさんあります。時々、霧の中で花を見ることができます。もちろん、さまざまな種類のライティング方法を理解できることも、JavaScript言語の特性をさらに詳しく理解することです。
(function(){…})()and(function(){…}())は、JavaScriptで機能を直ちに実行する2つの一般的な方法です。最初は、ブラケットに包まれた匿名の関数だと思ってから、関数を呼び出すブラケットを追加しました。最後に、関数が定義された直後にそれを実行する目的を達成しました。後で、ブラケットを追加する理由はそうではないことがわかりました。機能の実行をすぐに理解するには、最初に関数の基本的な概念を理解する必要があります。
関数宣言、関数式、匿名関数
関数宣言:function fnname(){…};関数キーワードを使用して関数を宣言し、関数宣言と呼ばれる関数名を指定します。
関数式var fnname = function(){…};関数キーワードを使用して関数を宣言しますが、関数には名前がありません。最後に、匿名関数には、関数式の構文の最も一般的な形式である関数式と呼ばれる変数が割り当てられます。
匿名関数:function(){};関数キーワードを使用して関数を宣言しますが、関数は名前が付けられていないため、匿名関数と呼ばれます。匿名関数は関数式に属します。匿名関数には多くの関数があります。変数を割り当てる場合、関数を作成し、イベントを割り当てる場合、イベントハンドラーになるか、閉鎖などを作成します。
関数宣言と関数式の式の違いは、1です。JavaScriptコードを解析する場合、JavaScriptエンジンは現在の実行環境(SCOPE)で「関数宣言促進」(関数宣言宣言)関数宣言です。関数式は、javascirtpエンジンが上から下線まで関数式を解析する前に、そのラインに実行するまで待つ必要があります。 2。関数式は、関数式の後にブラケットですぐに呼び出すことができます。関数宣言は実行できず、fnname()の形式でのみ呼び出すことができます。 2つの違いの2つの例を次に示します。
fnname(); function fnname(){...} //正常、関数宣言を「促進」するため、関数呼び出しはfnname(); var fnname = function(){...} //エラーが報告される可能性があります。 var fnname = function(){alert( 'hello world');}(); // function Expressionの後にParcelsが追加されます。 JavaScriptエンジンがここで解析する場合、関数は即時機能fnname(){alert( 'hello world');}(); //エラーはありませんが、javaScriptエンジンは関数宣言のみを解析し、後続のブラケットを無視し、関数宣言は関数と呼ばれません。 }(); //構文エラー、匿名関数は関数式に属しますが、割り当て操作は実行されませんが、// JavaScriptエンジンは最初の関数キーワードを関数宣言として扱い、エラーを報告します。いくつかの基本的な関数の概念を理解した後、私はすぐに(function(){…})()と(function(){…}())を書き込む2つの方法を振り返りました。最初は、それがブラケットに包まれた匿名の関数であると思って、すぐに関数を呼び出すためにブラケットを追加しました。当時、なぜブラケットを追加しなければならなかったのかわかりませんでした。後で、関数本文の後にブラケットを追加しなければならない場合、すぐにそれを呼び出すことができることに気付きました。次に、この関数は関数宣言ではなく関数式でなければなりません。
(function(a){console.log(a); // firebug output 123、use()operator})(123); (function(a){console.log(a); // firebug output 1234、use()operator}(1234)); !function(a){console.log(a); // firebug出力12345、使用!オペレーター}(12345); +function(a){console.log(a); // firebug output 123456、 + operatorを使用}(123456); -Function(a){console.log(a); // firebug output 1234567、 - オペレーターを使用}(1234567); var fn = function(a){console.log(a); // firebug output 12345678、= operator}(12345678)を使用します出力の結果を確認し、関数の前に追加できます! 、 +、 - そして、コンマでさえ、関数が定義された直後に実行するために使用できます。 +、 - 、=関数宣言を関数式に変換し、関数式と関数宣言を識別するJavaScriptエンジンの間の曖昧さを排除し、これが関数宣言ではなく関数式であることをjavaScriptエンジンに伝え、その後の括弧を追加して、関数のコードをすぐに実行できます。
ブラケットを追加することは、それを行うための最も安全な方法です。 、 +、および - などのオペレーターは、関数の戻り値で操作を実行します。これは、不必要なトラブルを引き起こすことがあります。
しかし、このように書くことの使用は何ですか?
JavaScriptにはプライベートスコープの概念はありません。複数の人々が開発したプロジェクトのグローバルまたはローカルスコープのいくつかの変数を宣言すると、同じ名前の他の人が上書きされる可能性があります。 JavaScript関数のスコープチェーンの特性によれば、この手法を使用してプライベートスコープを模倣し、匿名関数を「コンテナ」として使用できます。 「コンテナ」は外部変数にアクセスできますが、外部環境は「コンテナ」内の変数にアクセスできないため、内部(function(){…})()は、一般に「匿名ラッパー」または「名前空間」として知られている外部変数と矛盾しません。
jQueryはこの方法を使用します。 jQueryコードが(function(window、undefined){…jquery code…}(window)に包まれている場合、グローバル範囲でjqueryコードを呼び出すときにjqueryの内部変数を保護できます。
この記事は個人的な理解と編集です。エラーがある場合は、それらを指摘してください。記事の見解は次のとおりです。
「JavaScriptの権威あるガイド」と「高度なプログラミング」