JavaScriptに関数を作成するための2つの主な方法があります:関数宣言と関数式。どちらの方法でも、適用可能なシナリオが異なります。このメモは、主に機能式のいくつかの主要な特性と、以下で説明する使用シナリオに焦点を当てています。
主な機能
•オプションの関数名
関数名は、関数宣言の必要な部分です。この関数名は変数に相当します。新しく定義された関数は、この変数にコピーされます。関数への呼び出しは、将来この変数を通じて実行する必要があります。関数式の場合、関数の名前はオプションです。たとえば、次のようです。
var sub = function(a1、a2){return a1-a2; }この例では、関数式には名前がなく、匿名関数式に属します。次の例を見てみましょう。
var sub = function f(a1、a2){return a1-a2; } console.log(f(5,3)); // Call Method Console.log(sub(5,3)); //正しい呼び出しメソッドこの例では、関数式の名前はfです。この名前fは、実際に関数内のローカル変数になり、関数オブジェクト自体を指します。関数が再帰的である場合には非常に役立ち、後で詳しく説明します。
•実行フェーズ中に作成(関数宣言とは異なります)
この機能は、関数式が関数宣言と明らかに異なることです。
インタープリターは、JavaScriptコードを解析する場合、両方の方法を等しく扱いません。通訳者は最初に関数宣言を読み取り、コードを実行する前に利用可能にします。一方、関数式の場合、インタープリターが実際に解析されて実行される前に、それが位置するコードのラインに実行されるまで待つ必要があります。例えば:
console.log(add(1,2)); // "3" console.log(sub(5,3)); //「予期しない識別子」、エラー関数追加(a1、a2){return a1+a2; } var sub = function(a1、a2){return a1-a2; }最初のステートメントは正常に実行できます。コードを評価するとき、JavaScriptエンジンは最初のパスで機能を宣言し、関数宣言プロモーションと呼ばれるプロセスを通じてソースツリーの上部に配置します。つまり、実行環境の作成段階で(関数は呼び出されますが、実行を開始していません)、関数宣言は「ホスティング」になります。したがって、機能を宣言するコードがそれを呼び出すコードの背後にある場合でも、JavaScriptエンジンは関数宣言を上部に持ち上げます。ただし、関数宣言が関数式に変更された場合、実行中にエラーが報告されます。その理由は、関数が配置されているステートメントを実行する前に、変数サブには関数への参照が含まれていないためです。つまり、変数サブはコード実行段階で割り当てられます。上記の違いを除いて、他の側面では、関数宣言と関数式の構文は同等です。
•可変オブジェクトには影響しません
var sub = function f(a1、a2){console.log(typeof f); // "function" return a1-a2; } console.log(typeof f); // "conged referenceError:fは定義されていません(…)」上記の例から、関数名fは関数オブジェクト内でのみ使用でき、関数式の関数名は変数オブジェクトに存在しないことがわかります。
シナリオを使用します
関数表現には多くの使用シナリオがあります。以下は、主に関数の再帰とコードのモジュール性のアプリケーションについて説明しています。
•機能再帰
次の例を参照してください。
関数因子(num){if(num <= 1){return 1; } else {return num * factorial(num -1); }}これは古典的な要因関数ですが、この例の1つの問題は、関数名の要因が関数本体に密接に結合されていることです。次のステートメントを実行すると、エラーが発生します。
var AnotherFactorial =因子;要因= null; console.log(別の要因(5)); // "contaught typeerror:因子は関数ではありません"
エラーの理由は、因子関数が関数本体内で呼び出され、変数要因による関数への参照がキャンセルされているため、エラーが報告されているためです。この状況の解決策は、通常、引数を使用して解決できます。
関数因子(num){if(num <= 1){return 1; } else {return num * arguments.callee(num -1); }}このようにして、ここで別の構成関数を実行することで、正しい結果を得ることができます。ただし、厳格なモード「厳格」では、arguments.calleeにスクリプトを介してアクセスすることはできません。これは、機能式、例えば、この問題を解決する方法です。
var因子=(function f(num){if(num <= 1){return 1;} else {return num * f(num -1);}}); console.log(要因(5)); // "120"•コードモジュール性
JavaScriptにはブロックレベルの範囲はありませんが、関数式を使用してJavaScriptコードをモジュール化できます。モジュラーコードは、ユーザーに知られている必要のない詳細をカプセル化し、ユーザーの関連するインターフェイスにのみ公開し、次のようなグローバル環境への汚染を回避します。
var person =(function(){var _name = ""; return {getname:function(){return _name;}、setname:function(newname){_name = newname;}};}(}()); person.setName( "John"); person.getName(); //「ジョン」この例では、モジュール独自のプライベート変数と関数を含む匿名関数式が作成されます。この関数式の実行結果は、モジュールによってユーザーに公開されたパブリックインターフェイスを含むオブジェクトを返します。コードモジュール性には多くの特定の形式があります。たとえば、一般的に使用されるJavaScriptライブラリでは、通常、次の例と同様の即時実行機能が使用されます。
(function(){var _name = ""; var root = this; var person = {getname:function(){return _name;}、setname:function(newname){_name = newname;}}; root.person = person;} .call(this)); person.setName( "John"); person.getName(); //「ジョン」このメソッドは、モジュールのパブリックインターフェイスをグローバルオブジェクトの属性として含むオブジェクトを直接使用して、グローバルオブジェクトの属性を他の場所で使用できるようにします。
上記の決まり文句JavaScript関数式は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。