ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 関数式の特徴と再帰の理解 (例付き)

JavaScript 関数式の特徴と再帰の理解 (例付き)

不言
不言転載
2018-10-25 15:40:361845ブラウズ

この記事は 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 サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。