>  기사  >  웹 프론트엔드  >  자바스크립트 함수식의 특징과 재귀의 이해(예제 포함)

자바스크립트 함수식의 특징과 재귀의 이해(예제 포함)

不言
不言앞으로
2018-10-25 15:40:361847검색

이 글은 자바스크립트 함수 표현의 특징과 재귀에 대한 이해(예제 포함)에 관한 내용으로, 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

함수 표현식은 JavaScript의 강력하면서도 혼란스러운 기능입니다.

함수를 정의하는 방법에는 두 가지가 있습니다. 하나는 함수 선언이고 다른 하나는 함수 표현입니다.

함수 선언의 구문은 다음과 같습니다.

function functionName(arg0, arg1, arg2) {
    //函数体
}

구문: 먼저 함수 키워드, 그 다음 함수 이름, 함수 이름이 지정되는 방식입니다.

Firefox, Safari, Chrome 및 Opera는 모두 함수에 대해 지정된 이름에 액세스할 수 있는 비표준 이름 속성을 정의합니다.
이 속성의 값은 항상 function 키워드 뒤에 오는 식별자와 동일합니다.

//只在Firefox、Safari、Chrome和Opera有效
function functionName(arg0, arg1, arg2) {
}
console.log(functionName.name); // "functionName"

함수 선언과 관련하여 중요한 기능 중 하나는 함수 선언 호이스팅(Function Declaration Hoisting)입니다. 즉, 코드를 실행하기 전에 함수 선언을 읽는다는 의미입니다. 이는 함수 선언이 이를 호출하는 명령문 뒤에 배치될 수 있음을 의미합니다.

sayName(); // "Shaw"
function sayName(){
    console.log("Shaw");
}

코드가 실행되기 전에 함수 선언을 읽기 때문에 이 예제에서는 오류가 발생하지 않습니다.

함수를 만드는 두 번째 방법은 함수 표현식을 사용하는 것입니다.

함수 표현식에는 여러 가지 구문 형식이 있습니다.
다음은 가장 일반적인 형태입니다.

var functionName =  function(arg0, arg1, arg2) {
    //functionBody
};

이 형식은 일반 변수 할당 문, 즉 함수를 생성하고 이를 functionName 변수에 할당하는 것과 비슷합니다.

이 경우 생성된 함수를 익명 함수라고 합니다. 함수 키워드 뒤에 식별자가 없기 때문입니다.
익명 함수를 람다 함수라고도 합니다. 익명 함수의 이름 속성은 널 문자입니다.

함수 표현식은 다른 표현식과 마찬가지로 사용하기 전에 값을 할당해야 합니다.

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() 함수 내부에서는 익명입니다.
함수가 값으로 사용될 때마다 익명 함수를 사용할 수 있습니다.
그러나 이것이 익명 함수의 유일한 사용은 아닙니다.

Recursion

재귀 함수는 함수 이름을 통해 함수가 자신을 호출할 때 형성됩니다.

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 변수에 저장한 다음, 계승 변수를 null로 설정합니다. 결과적으로 원래 함수에 대한 참조는 하나만 있습니다.
하지만 다음에 anotherFactory()가 호출되면 반드시factorial()을 실행해야 하는데,factorial은 더 이상 함수가 아니므로 오류가 발생하게 됩니다.

Google Chrome에서 위 코드를 테스트했지만 작동하지 않았습니다. 이 부분을 깊이 이해하지 않는 것이 좋습니다.
이 경우args.callee를 사용하면 문제를 해결할 수 있습니다.

arguments.callee는 실행 함수에 대한 포인터이므로 함수에 대한 재귀 호출을 구현하는 데 사용할 수 있습니다.

function factorial(num) {
    if(num <= 1) {
        return 1;
    } else {
        return num * arguments.callee(num-1);
    }
}

“return num *args.callee(num-1);” 함수 이름 대신에args.callee를 사용하면 함수를 어떻게 호출하든 문제가 발생하지 않는 것을 확인할 수 있습니다.
따라서 재귀 함수를 작성할 때 함수 이름을 사용하는 것보다args.callee를 사용하는 것이 항상 더 안전합니다.

그러나 엄격 모드에서는 인수.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는 여전히 유효하므로 재귀 호출이 여전히 올바르게 완료될 수 있습니다.
이 방법은 엄격 모드와 비엄격 모드 모두에서 작동합니다.

위 내용은 자바스크립트 함수식의 특징과 재귀의 이해(예제 포함)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제