JavaScript 함수 표현 식 상세 설명 및 인 스 턴 스

JavaScript 함수 표현 식
차례
      함 수 를 정의 하 는 방식 은 두 가지 가 있 습 니 다.하 나 는 함수 성명 이 고 다른 하 나 는 함수 표현 식 입 니 다.
      1.1 함수 선언

function functionName(arg){
   //   
}
      함수 성명 에 대해 중요 한 특징 은 함수 성명 향상 입 니 다.코드 를 실행 하기 전에 함수 성명 을 먼저 읽 는 것 입 니 다.이것 은 함 수 를 호출 된 문장 뒤에 놓 을 수 있다 는 것 을 의미한다.다음 과 같다.

helloworld(); //               
function helloworld(){
  console.log("hello world");
}
     1.2 함수 식

var functionName=function(arg){
   //   
}
      이 형식 은 함 수 를 만 들 고 변수 functionName 에 값 을 부여 하 는 일반적인 변수 할당 문 처럼 보 입 니 다.이 경우 만 든 함 수 를 익명 함수 라 고 합 니 다.function 키워드 뒤에 식별 자가 없 기 때 문 입 니 다.
함수 표현 식 은 다른 표현 식 과 마찬가지 로 사용 하기 전에 값 을 부여 해 야 합 니 다.아래 코드 가 오 류 를 일 으 킬 수 있 습 니 다.

helloworld(); //  ,    ,     

var helloworld=function(){
  console.log("hello world");
}

       함수 표현 식 이 있 으 면 우 리 는 함수 표현 식 에 동적 으로 값 을 부여 할 수 있 습 니 다.다음 코드 와 같이:

var helloworld; //  
if(condition){ //  
  helloworld=function(){ //  
    console.log("hello world"); 
  }
}
else{
  helloworld=function(){ //  
    console.log("  ,  ");
  }
}
2.재 귀 함수
     재 귀 함 수 는 한 함수 가 이름 을 통 해 자신 을 호출 하 는 상황 에서 구 성 된 것 이다(C\#등 언어 와 같 기 때문에 프로그램의 핵심 사상 은 차이 가 많 지 않다.다만 문법 적 으로 차이 가 있 을 뿐이다.한 언어의 기 초 를 잘 배우 면 다른 것 을 쉽게 배 울 수 있다).전형 적 인 재 귀 면접 문 제 를 들 면 한 열의 규칙 은 다음 과 같다.1,1,2,3,5,8,13,21.34............................................................  재 귀 알고리즘 으로 이 루어 집 니 다.코드 는 다음 과 같 습 니 다.

   function foo(n) {
      if (n <= 0)
        return 0;
      else if (n > 0 && n <= 2)
        return 1;
      else
        return foo(n - 1) + foo(n - 2);
    }
이 함 수 는 문제 가 없 는 것 처럼 보이 지만 아래 코드 는 오류 가 발생 할 수 있 습 니 다.

   var foo1 = foo;
    foo = null;
    console.log(foo1(34));
상기 코드 는 먼저 foo()함 수 를 변수 foo 1 에 저장 한 다음 에 foo 변 수 를 null 로 설정 한 결과 원시 함수 에 대한 인용 이 하나 밖 에 남지 않 았 습 니 다.그러나 다음 에 foo 1()을 호출 할 때 foo()를 실행 해 야 하기 때문에 foo 는 이미 null 이기 때문에 오류 가 발생 할 수 있 습 니 다.이 경우 arguments.callee 를 사용 하면 이 문 제 를 해결 할 수 있 습 니 다.arguments.callee 는 실행 중인 함 수 를 가리 키 는 지침 이기 때문에 함수 에 대한 재 귀적 호출 을 실현 할 수 있 습 니 다.

 function foo(n) {
      if (n <= 0)
        return 0;
      else if (n > 0 && n <= 2)
        return 1;
      else
        return arguments.callee(n - 1) + arguments.callee(n - 2);
    }
이름 함수 표현 식 을 사용 하여 같은 결 과 를 얻 을 수 있 습 니 다.예 를 들 면:

 var foo = (function f(n) {
      if (n <= 0)
        return 0;
      else if (n > 0 && n <= 2)
        return 1;
      else
        return f(n - 1) + f(n - 2);
    });
셋째,폐쇄
      3.1 패 킷 은 다른 함수 역할 영역 에 접근 할 수 있 는 변 수 를 말 합 니 다.패 킷 을 만 드 는 흔 한 방식 은 한 함수 내부 에 다른 함 수 를 만 드 는 것 입 니 다.패 킷 을 이해 하려 면 먼저 자바 스 크 립 트 의 특수 변수의 역할 영역 을 이해 해 야 합 니 다.변수의 작용 역 은 두 가지,전역 변수 와 국부 변수 가 아니다.다음은 몇 개의 demo 를 써 서 직관 적 으로 표현 한다.
함수 내부 에서 전역 변 수 를 직접 읽 기:

 var n = 100; //        
    function fn() {
      console.log(n); //            
    }

    fn();

함수 외부 에서 부분 변 수 를 직접 읽 을 수 없습니다:

    function fn() {
      var n = 100;
    }

    console.log(n); //n is not defined
여기 서 주의해 야 할 것 은 함수 내부 에서 변 수 를 설명 할 때 반드시 var 를 사용 해 야 한 다 는 것 입 니 다.사용 하지 않 으 면 전역 변수 가 됩 니 다.

 function fn() {
       n = 100;
    }
    fn();
    console.log(n); //100
때때로 우 리 는 함수 내부 성명 의 변 수 를 받 아야 하기 때문에 위 에서 언급 한 패 킷 을 만 드 는 일반적인 방식 을 사용 하여 함수 내부 에 다른 함 수 를 만 들 수 있 습 니 다.

   function fn() {
      n = 100;

      function fn1() {
        console.log(n);
      }

      fn1();
    }
    fn(); //100

위의 코드 에서 함수 fn1 은 함수 fn 내부 에 포함 되 어 있 습 니 다.이때 fm 내부 의 모든 부분 변 수 는 fn1 에 대해 볼 수 있 습 니 다.그러나 반대로 안 됩 니 다.fn1 내부 의 부분 변 수 는 fn 에 보이 지 않 습 니 다.이것 이 바로 자바 script 언어 특유 의'체인 역할 도 메 인'구조 로 하위 대상 은 모든 부모 대상 의 변 수 를 한 단계 씩 위로 찾 습 니 다.따라서 부모 대상 의 모든 변 수 는 자식 대상 을 볼 수 있 고 그렇지 않 으 면 성립 되 지 않 습 니 다.
fn1 이 fn 내부 변 수 를 읽 을 수 있다 니,fn1 을 반환 값 으로 하면 외부 에서 fn 변 수 를 읽 을 수 있 습 니 다.

function fn() {
      n = 100;

      function fn1() {
        console.log(n);
      }

      return fn1;
    }
    
    var result=fn();
    result(); //100

여기 서 fn1 은 패 킷 을 닫 는 것 이 고 패 킷 을 닫 는 것 은 다른 함수 내부 변 수 를 읽 을 수 있 는 함수 입 니 다.자 바스 크 립 트 언어 에 서 는 함수 내부 의 하위 함수 만 국부 변 수 를 읽 을 수 있 기 때문에 패 키 지 를 닫 는 것 을'함수 내부 에 정 의 된 함수'로 간단하게 이해 할 수 있 습 니 다.그래서 본질 적 으로 폐쇄 는 함수 내부 와 함수 외 부 를 연결 하 는 다리 이다.
       3.2  폐쇄 적 용도
       그것 의 가장 큰 용 도 는 두 가지 가 있 습 니 다.하 나 는 앞에서 언급 한 함수 내 부 를 읽 을 수 있 는 변수 이 고 다른 하 나 는 이 변수의 값 을 항상 메모리 에 유지 하 는 것 입 니 다.다음 코드 와 같이:

function fn() {
      n = 100;

      nadd = function () {
        n += 1;
      }

      function fn1() {
        console.log(n);
      }

      return fn1;
    }

    var result = fn();
    result(); //100
    nadd();
    result(); //101

메모:패 킷 함 수 는 함 수 를 포함 하 는 역할 영역 을 가지 고 있 기 때문에 다른 함수 보다 더 많은 메모 리 를 사용 할 수 있 습 니 다.패 킷 을 지나치게 사용 하면 메모리 가 너무 많이 차지 할 수 있 으 므 로 함 수 를 종료 하기 전에 사용 하지 않 는 부분 변 수 를 모두 삭제 합 니 다.
 4.블록 급 역할 영역
       블록 급 역할 영역(사유 역할 영역 이 라 고도 함)의 익명 함수 의 문법 은 다음 과 같다.

(function(){
   //     
})();
어느 곳 에서 든 임시 적 으로 변 수 를 필요 로 하면 개인 역할 도 메 인 을 사용 할 수 있 습 니 다.예 를 들 어:

(function () {
      var now = new Date();
      if (now.getMonth() == 0 && now.getDate() == 1) {
        alert("    ");
      }
    })();
위의 코드 를 전역 역할 영역 에 넣 으 면 1 월 1 일이 되면'새해 복 많이 받 으 세 요'라 는 축복 이 팝 업 됩 니 다.이런 기술 은 전역 작용 역 에서 함수 외부 에 자주 사용 되 기 때문에 전역 작용 역 에 너무 많은 변수 와 함 수 를 추가 하 는 것 을 제한한다.일반적으로,우 리 는 전역 작용 역 에 변수 와 함 수 를 최대한 적 게 추가 해 야 한다.많은 개발 자 들 이 공동으로 참여 하 는 대형 응용 프로그램 에서 과도 한 전역 변수 와 함 수 는 명명 충돌 을 초래 하기 쉽다.그리고 개인 용 역할 도 메 인 을 만 들 면 모든 개발 자 는 자신의 변 수 를 사용 할 수 있 을 뿐만 아니 라 전체적인 역할 도 메 인 을 흐 트 러 뜨리 는 것 도 걱정 할 필요 가 없다.
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기