この記事は JavaScript の関数式の特徴と再帰の理解について説明したものであり、必要な方は参考にしていただければ幸いです。
関数式は JavaScript の強力ですがわかりにくい機能です。
関数を定義するには 2 つの方法があります。1 つは関数宣言で、もう 1 つは関数式です。
関数宣言の構文は次のようになります。
function functionName(arg0, arg1, arg2) { //函数体 }
構文: 最初に関数キーワード、次に関数名を指定します。このようにして関数名を指定します。
Firefox、Safari、Chrome、および Opera はすべて、関数に対して非標準の name 属性を定義しており、これを通じて関数に指定された名前にアクセスできます。
この属性の値は、常に function キーワードに続く識別子と等しくなります。
//只在Firefox、Safari、Chrome和Opera有效 function functionName(arg0, arg1, arg2) { } console.log(functionName.name); // "functionName"
関数宣言に関して、その重要な機能の 1 つは関数宣言ホイスティングです。これは、コードを実行する前に関数宣言が読み取られることを意味します。これは、関数宣言をそれを呼び出すステートメントの後に配置できることを意味します。
sayName(); // "Shaw" function sayName(){ console.log("Shaw"); }
コードが実行される前に関数宣言が読み取られるため、この例ではエラーはスローされません
関数を作成する 2 番目の方法は、次のとおりです。関数式を使用します。
関数式には、いくつかの異なる構文形式があります。
以下は最も一般的な形式です。
var functionName = function(arg0, arg1, arg2) { //functionBody };
この形式は、通常の変数代入ステートメントのように見えます。つまり、関数を作成し、それを変数 functionName に割り当てます。
関数キーワードの後に識別子がないため、この場合に作成される関数は 匿名関数 (匿名関数) と呼ばれます。
匿名関数はラムダ関数とも呼ばれます。無名関数の name 属性が null 文字です。
関数式には、他の式と同様に、使用する前に値を割り当てる必要があります。
sayHi(); // error : sayHi is not a function var sayHi = function(){ console.log("Hi"); } // var sayHi //此时sayHi是undefined // sayHi() // error : sayHi is not a function // sayHi = function() { console.log("Hi");}
関数のプロモーションを理解する鍵は、関数宣言と関数式の違いを理解することです。
関数を作成して変数に代入したり、その関数を他の関数の値として返すこともできます。
function createComparisonFunction(propertyName) { return function(object1, object2) { var value1 = object1[propertyName]; var value2 = object2[propertyName]; if(value1 < value2) { return -1 }else if(value1 > value2) { return 1; } else { return 0; } } }
createComparisonFunction() は匿名関数を返します。
返された関数は、変数に割り当てられるか、他の方法で呼び出される可能性があります。
ただし、createComparisonFunction() 関数内では匿名です。
関数が値として使用される場合、匿名関数を使用できます。
ただし、匿名関数の使用法はこれだけではありません。
再帰関数は、関数が関数名を通じてそれ自体を呼び出すときに形成されます。
function factorial(num) { if(num <= 1) { return 1; } else { return num * factorial(num-1); } } factorial(4); // 4*3*2*1 = 24 //4* factorial(3) => 4*3*factorial(2) => 4*3*2*factorial(1) => 4*3*2*1 => 24
これは古典的な再帰階乗関数です。この関数は表面的には問題ないように見えますが、次のコードによりエラーが発生する可能性があります。
function factorial(num) { if(num <= 1) { return 1; } else { return num * factorial(num-1); } } var anotherFactorial = factorial; factorial = null; //注意这里,其实函数factorial指向一个空对象。 console.log(anotherFactorial(4)); //Error: anotherFactorial is not a function
上記のコードは、まず、factorial() 関数を変数 anotherFactorial に保存し、次に、factorial 変数を null に設定します。その結果、元の関数への参照は 1 つだけになります。
しかし、次に anotherFactory() が呼び出されるときは、factorial() を実行する必要があり、factorial は関数ではなくなっているため、エラーが発生します。
Google Chrome は上記のコードをテストしましたが、機能しませんでした。この部分については深く理解しないことをお勧めします。
この場合、arguments.callee を使用すると問題を解決できます。
arguments.callee は実行中の関数へのポインターであるため、関数への再帰呼び出しを実装するために使用できます。
function factorial(num) { if(num <= 1) { return 1; } else { return num * arguments.callee(num-1); } }
"return num * argument.callee(num-1);" 関数名の代わりに argument.callee を使用すると、どのように関数を呼び出しても問題が発生しません。
したがって、再帰関数を作成する場合は、関数名を使用するよりも argument.callee を使用する方が常に安全です。
ただし、厳密モードでは、スクリプトから argument.callee にアクセスできず、このプロパティにアクセスするとエラーが発生します。
しかし、名前付き関数式を使用して同じ結果を得ることができます。
var factorial = function f(num){ if(num <= 1) { return 1; } else { return num * f(num-1); } } //factorial 指向了函数f var anotherFactorial = factorial; //anotherFactorial 指向了函数f factorial = null; //factorial 指向了一个空对象。 anotherFactorial(4); //24 ////anotherFactorial 指向了函数f, 所以还可以正常调用。
上記のコードは、f() という名前の関数式を作成し、それを変数階乗に割り当てます。
関数が別の変数に代入されている場合でも、関数名 f は依然として有効であるため、再帰呼び出しは引き続き正しく完了できます。
このメソッドは、厳密モードと非厳密モードの両方で機能します。
以上がJavaScript 関数式の特徴と再帰の理解 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。