학습 노트 (6): 함수

14482 단어 JavaScript함수.
함 수 를 정의 하 는 두 가지 방식
하 나 는 함수 성명 입 니 다. 실제 변 수 는 함수 대상 을 가리 키 는 변 수 를 설명 합 니 다.둘째, 함수 표현 식 입 니 다. 이 방식 으로 함수 의 이름 을 선택 할 수 있 습 니 다. 보통 함수 이름 이 없 지만 있 을 수 있 습 니 다. 예 를 들 어:
var f = function fact(x) {
    if (x <= 1) {
        return 1;
    }
    else {
        return x * fact(x-1);
    }
}

이때 함수 이름 은 실제 함수 내부 의 부분 변수 입 니 다.이렇게 재 귀 가 필요 할 때 가 아니면 이름 을 요구 해 서 는 안 된다.
함수 표현 식 을 사용 하면 한 번 만 사용 할 수 있 는 함 수 를 정의 하 는 데 적합 합 니 다.
함수 성명 은 진짜 문장 이 아 닙 니 다. 전역 적 으로 나 다른 함수 에 포 함 될 수 있 지만 if, 순환, try.. 블록 에 나타 날 수 없습니다. 그러나 함수 정의 표현 식 은 JS 코드 의 어느 곳 에 도 나타 날 수 있 습 니 다.
함수 이름
낙타 봉 식, 사유 함 수 는 보통시작프레임 워 크 프로 그래 밍 에서 자주 사용 하 는 함수 의 짧 은 이름 을 지정 할 수 있 습 니 다. 예 를 들 어 $= jQuery.
함수 호출
로:
  • 함수
  • 방법
  • 구조 함수
  • 콜, apply 를 통 해 간접 호출
  • 방법 호출
  • 그 호출 된 문맥 은 대상 이 고 방법 으로 호출 할 때 실제 적 으로 암시 적 인 실제 인삼, 즉 대상 이 들 어 왔 다.함수 체 내 에서 this 를 사용 하여 이 대상 을 참조 할 수 있 습 니 다.
  • 방법 이 값 을 되 돌려 주지 않 을 때 this 로 돌아 가 는 것 이 좋 습 니 다. 그러면 '체인 호출' 스타일 의 프로 그래 밍 을 할 수 있 습 니 다.예 를 들 면 jQuery.
  • this 는 키워드 입 니 다. 변수 가 아니 라 this 에 값 을 부여 할 수 없습니다.
  • 포 함 된 함 수 는 호출 된 함수 에서 this 를 계승 하지 않 습 니 다.끼 워 넣 은 함수 가 방법 으로 호출 되면 this 는 호출 대상 을 가리 키 고 있 습 니 다.함수 로 호출 되면 this 는 전역 대상 (비 엄격 모드) 이 아니면 Undefined (엄격 모드) 입 니 다.따라서 외부 함수 의 this 값 에 접근 하려 면 this 값 을 하나의 변수 에 저장 해 야 합 니 다. 이 변 수 는 내부 함수 와 같은 역할 영역 에 있 습 니 다.

  • 간접 호출
    call 과 apply 는 호출 에 필요 한 this 값 을 표시 하여 모든 함수 가 대상 으로 호출 할 수 있 도록 합 니 다.전 자 는 매개 변 수 를 하나씩 전달 하고 후 자 는 매개 변 수 를 하나의 배열 로 '포장 하여 전달' 하기 때문에 한 함수 에 들 어 가 는 실제 인삼 은 배열 이지 만 형 삼 은 단일 한 것 이 기 대 됩 니 다. 다음 과 같은 형식 을 사용 할 수 있 습 니 다.
    func.apply(this,arrOfArg);

    함수 의 실 삼 과 형 삼
  • 들 어 오지 않 은 실제 인삼 의 값 은 undefined 입 니 다. 보통 | | 으로 선택 가능 한 인삼 의 기본 값 을 설정 합 니 다.
  • function getPropertyNames(o, a) {
        a = a || []; //     ||a      ,    ;           
        for(var pro in o) {
            a.push(pro);
        }
        return a;
    }

    2. 들 어 오 는 실제 매개 변수 가 형 삼 을 초과 하면 이름 이 없 는 참조 할 만 한 것 을 직접 얻 을 수 없 지만 함수 내 에 하나의 배열 대상 arguments 가 실제 매개 변 수 를 가리 키 며 아래 표 시 를 통 해 들 어 오 는 실제 참 조 를 방문 할 수 있 습 니 다.
    function f(x) {
        console.log(x);
        arguments[0] = null;
        console.log(x);
    }
    var a = 12;
    f(12);
    var b = [1,2,3];
    f(b);

    위의 코드 에 서 는 실제 인삼 a 든 b 든 두 번 째 console. log 에 null 이 표 시 됩 니 다.arguments [0] = = x 를 실행 하 는 것 도 true 로 돌아 갑 니 다.따라서 실제 참조 형식 이 든 원본 형식의 값 이 든 arguments 와 x 는 같은 값 을 가리 키 며 그 중 하 나 를 수정 하면 다른 값 에 영향 을 줄 수 있 습 니 다.책 에서 말 한 것 처럼 일반 배열 에 들 어가 면 null 을 출력 하지 않 습 니 다.
    3. arguments 대상 의 속성:
  • length
  • callee: 현재 실행 중인 함 수 를 말 합 니 다. 익명 함수 에서 callee 를 통 해 자신 을 재 귀적 으로 호출 하 는 것 이 유용 합 니 다.
  • var fact = function(x) {
        if (x <= 1) {
            return 1;
        }
        return x * arguments.callee(x-1);
    };
  • caller: 현재 실행 중인 함 수 를 대신 호출 하 는 함수
  • 4. * 실 삼 이 들 어 올 때 형 삼 순서 등의 번 거 로 움 을 간략하게 기억 하기 위해 실 삼 을 이름 / 값 쌍 아의 형식 으로 들 어 갈 수 있 고 여러 실 삼 을 하나의 대상 으로 할 수 있다. *
    사용자 정의 함수 속성
    함 수 는 특수 한 대상 으로 일반 변수 처럼 값 을 부여 하고 매개 변수 로 서 반환 값 으로 할 수 있 습 니 다.또한 속성 이 있 을 수 있 습 니 다. 함수 가 '정적' 변 수 를 필요 로 할 때 특정한 값 이 변 하지 않 고 함수 의 속성 으로 정의 할 수 있 습 니 다. 전역 변 수 를 정의 하 는 것 이 아니 라 함수 의 속성 으로 정의 할 수 있 습 니 다.
    function fact(n) {
        if (isFinite(n) && n>0 && n==Math.round(n)) {
            if(!(n in fact)) {
                fact[n] = n * fact(n-1); //          
            }
            return fact[n];
        }
        else {
            return NaN;
        }
    }
    fact[1] = 1;
    fact(10);
    for(var v in fact) {
        console.log(v + ': ' + fact[v]);
    }

    네 임 스페이스 로 서 의 함수
    함수 내부 에서 정 의 된 변 수 는 모두 부분 변수 이기 때문에 하나의 함 수 를 네 임 스페이스 로 정의 할 수 있 고 내부 에서 정 의 된 변 수 는 외부 전역 변 수 를 오염 시 키 지 않 습 니 다.
    폐쇄 하 다
    1.  이해 역할 도 메 인 체인: 실행 환경 (전역 또는 함수) 에 들 어 갈 때마다이 환경 에서 변 수 를 저장 하기 위해 변 수 를 생 성 합 니 다. 이 대상 은 역할 도 메 인 체인 의 맨 앞 에 추 가 됩 니 다. 내부 함수 의 역할 도 메 인 체인 에는 외부 환경 역할 도 메 인 체인 을 가리 키 는 변수 대상 의 인용 이 포함 되 어 있 습 니 다. 따라서 외부 함수 가 실 행 된 후 내부 함수 가 외부 함수 에 대한 변수 대상 에 대한 인용 을 가지 고 있 기 때문에 외부 함수 가 실 행 된 후 에는 외부 함수 에 대한 참조 가 있 습 니 다.부 함수 역할 도 메 인 체인 의 변수 대상 은 소각 되 지 않 습 니 다. 따라서 외부 함수 가 실행 되면 내부 함 수 를 통 해 외부 함수 정의 변수 에 접근 할 수 있 습 니 다. 따라서 패 키 지 를 닫 으 면 함수 외부 에서 내부 정의 의 개인 변 수 를 간접 적 으로 방문 할 수 있 습 니 다. 예:
    var uniqueInteger = (function() {
        var counter = 0;
        return function() { 
            console.log(counter);
            counter++; 
        };
    })();
    uniqueInteger(); //0
    uniqueInteger(); //1
    uniqueInteger(); //2

    counter 는 함수 가 정의 하 는 부분 변수 입 니 다. 그러나 이 익명 함 수 는 즉시 실행 되 고 닫 힌 패 킷 을 되 돌려 줍 니 다. 이 닫 힌 역할 도 메 인 체인 의 변수 대상 은 외부 함수 변 수 를 가지 고 있 기 때문에 닫 힌 패 킷 을 되 돌려 주 고 유 니 크 Integer 에 값 을 부여 한 후에 도 외부 에서 counter 를 방문 할 수 있 습 니 다. 유 니 크 Integer 는 닫 힌 패 킷 에 대한 인용 을 가지 고 있 기 때문에 닫 힌 역할 도 메 인 체인 은 줄곧 사용 되 지 않 습 니 다.소각 된다.
    2.  함 수 는 호출 할 때마다 새로운 역할 도 메 인 체인 을 만 듭 니 다. 역할 도 메 인 체인 을 형성 하 는 변수 대상 이 무엇 인지 매번 알 고 싶다 면 폐쇄 를 이해 하기 어렵 지 않 습 니 다. 서로 방해 하지 않 는 두 개의 카운터:
    function counter() {
        var n = 0;
        return {
            count: function() { return n++;},
            reset: function() { n = 0; }
        };
    }
    var c = counter();
    var d = counter();

    매번 conter 를 호출 할 때마다 새로운 역할 도 메 인 체인 을 만 들 었 기 때문에 c, d 는 서로 다른 개인 변수 n 에 접근 할 수 있 습 니 다.
    3.   여러 개의 패 킷 은 함수 내 부 를 포함 하 는 개인 변 수 를 공유 할 수 있 습 니 다. 패 킷 은 외부 함 수 를 통 해 되 돌아 오 거나 외부 대상 으로 하 는 방법 으로 외부 에서 도 패 킷 을 호출 할 수 있 습 니 다.
    4.   하나의 함수 내부 의 패 키 지 는 이 함수 에서 정 의 된 부분 변 수 를 공유 하 는 것 입 니 다. 모든 패 키 지 는 각각 부분 변 수 를 복사 하 는 것 이 아니 라 모든 패 키 지 를 닫 는 역할 도 메 인 체인 에서 외부 함 수 를 가리 키 는 변수 대상 이 똑 같 습 니 다. 즉, 외부 함수 역할 도 메 인 체인 의 맨 앞 에 있 는 변수 대상 입 니 다.
    function constfuncs() {
        var funcs = [];
        for (var i = 0; i < 10; i++) {
            funcs[i] = function() {
                return i;
            };
        }
        return funcs;
    }
    funcs[5](); //9

    여기 서 funcs 는 10 개의 패 킷 을 닫 은 배열 을 저장 하고 모든 패 킷 은 이 부분 변 수 를 공유 하 며 1 차 순환 을 거 친 후에 i 는 9 가 되 었 습 니 다.
    5.   함수 마다 this 가 있 기 때문에 내장 함 수 는 외부 함수 this 값 에 접근 할 수 없습니다. 하나의 변수 에 표시 되 지 않 는 한 arguments 대상 도 this 와 유사 합 니 다. 변수 에 저장 해 야 포 함 된 함수 에 접근 할 수 있 습 니 다.
    함수 의 속성, 방법 과 구조 함수
    1.   arguments. length 는 실제 들 어 오 는 실 삼 의 개수 이 고, arguments. callee. length 는 함수 의 length 속성 은 들 어 오 기 를 기대 하 는 실 삼 의 개수 즉 형 삼 의 개 수 를 나타 낸다.
    2.   prototype 속성 은 함수 마다 이 속성 이 있 습 니 다. 원형 대상 을 가리 키 고 있 습 니 다. 함수 가 구조 함수 일 때 새로 만 든 대상 은 원형 대상 에서 속성 을 계승 합 니 다.
    3.   call 과 apply 는 어떤 함수 가 하나의 대상 처럼 보일 수 있 는 방법 입 니 다. 이 함수 의 호출 컨 텍스트 를 입력 대상 으로 변경 할 수 있 습 니 다. 함수 제 에서 this 를 통 해 들 어 오 는 대상 의 인용 을 얻 을 수 있 습 니 다. ES5 엄격 한 모드 에서 들 어 오 는 첫 번 째 실 삼 은 this 값 으로 변 합 니 다. 원본 값 이나 null, undefined 가 들 어 오 더 라 도 ES3 와 비 엄격 모드 에 서 는 this 값 으로 변 합 니 다.들 어 오 는 null, undefined 는 전체 대상 으로 대체 되 고 원본 값 은 포장 대상 으로 대 체 됩 니 다.
    4.   bid 방법 은 함 수 를 대상 에 연결 하여 이 대상 의 방법 처럼 bid 를 새로운 함수 로 되 돌려 줍 니 다. call, apply 처럼 역할 영역 을 수정 하지 않 고 즉시 호출 할 수 있 습 니 다. bid 방법 을 실현 합 니 다.
    function bind(f, o) {
        if (f.bind) {
            return f.bind(o);
        }
        return function() {
            return f.apply(o, arguments);
        }
    }
    function func(y) {
        return this.x + y;
    }
    var o = {
        x: 1
    };
    var resfunc = bind(func, o);
    var res = resfunc(2); //3

    bind 에 들 어 오 는 첫 번 째 실 삼 을 제외 한 다른 매개 변 수 는 this 에 연결 되 며, 이 함수 식 프로 그래 밍 기술 은 "currying" 이 라 고 합 니 다. 즉, f. bind (o,...) 는 일부 매개 변 수 를 순서대로 f 의 매개 변수 로 전송 할 수 있 으 며, 들 어 오 는 매개 변 수 는 o (즉 this) 의 속성 으로 전 달 됩 니 다. 이 외 에 f. bind (o,...)되 돌아 오 는 함 수 는 호출 할 때 실 삼 에 다시 들 어 갈 수 있 으 며, 형 삼 이 나타 나 는 순서에 따라 뒤에 남 은 형 삼 에 일일이 대응 할 수 있다. 예 를 들 어:
    function f(y, z) {
        return this.x + y + z;
    }
    var g = f.bind({x: 1}, 2); //x==1, y==2
    g(3); // z==3,  6

    5.   toString 방법 은 함수 의 원본 코드 를 되 돌려 줍 니 다. Object. prototype. toString. apply (f) 는 '[Object Function]' 을 되 돌려 줍 니 다. 서로 다른 유형의 toString 방법 이 재 작성 되 었 기 때문에 종 류 를 검사 할 때 는 원형 방법 을 사용 해 야 합 니 다.
    함수 식 프로 그래 밍
    배열 의 map, reduce 등 방법 을 사용 하여 함수 식 프로 그래 밍 을 할 수 있 습 니 다.
    고급 함수
    즉, 하나 이상 의 함 수 를 매개 변수 로 받 아들 이 고 새로운 함 수 를 되 돌려 줍 니 다. 조작 함수 의 함수 입 니 다. 예 를 들 어 계산 과 평 법:
    function compose(f, g) {
        return function() {
            return f.call(this, g.apply(this, arguments));
        }
    }
    
    var square = function(x) { return x * x; };
    var sum = function(x, y) { return x + y; };
    var squareOfSum = compose(square, sum);
    squareOfSum(2, 3); //25

    이 함 수 는 두 함수 f, g 를 수신 하고 새로운 함수 h 를 되 돌려 h 에서 f (g) 의 계산 을 합 니 다. h 가 받 은 매개 변 수 는 g, g 의 결 과 를 매개 변수 로 f. g, f 가 사용 하 는 this 와 h 의 동일 함 을 전달 합 니 다.

    좋은 웹페이지 즐겨찾기