2. 휘두르기 함수

3244 단어

익명 함수


익명 함수를 만드는 경우 일반적으로 익명 함수를 변수에 저장하거나 대상으로 삼거나 리셋합니다.
//  
window.onload=function (){console.log(1)};

//  
var a={
    x: function () {
        console.log(1)
    }
};
a.x();

//  setTimeout() 
setTimeout(function(){
    console.log(1)
},500);

차례로 돌아가다


귀속 함수는 두 가지 조건이 있는데 그것이 바로 자신을 인용하고 종료 조건이 있다.귀속 함수는 무한 순환에서 중지할 수 없습니다.
일반 명명 함수의 귀속
//  , 
function a(n){
   return n>1?a(n-1)+1:1; 
}
console.log(a.x(5)); // 5

방법 중의 귀속으로 삼다
하나의 귀속 함수를 하나의 대상으로 하는 방법으로, 귀속 함수는 익명 함수로 대상의 속성에 값을 부여합니다.
//  
var a={
    x:function (n){
        return n>1? a.x(n-1)+1:1;
    }
};
console.log(a.x(5)); // 5

이러한 참조 방법에는 다음과 같은 참조 손실 문제가 있습니다.
//  b, a 。
var b={
    x: a.x
};
// a , , a x 
a={};
console.log(b.x(5)); //     ,b x a.x ,a.x , 

익명 함수에서 더 이상 표시되는 a 인용을 사용하지 않고 함수 상하문 (this) 을 사용하여 인용하면 이 문제를 해결할 수 있습니다.
//  , 
var a={
    x:function (n){
        return n>1? this.x(n-1)+1:1;
    }
};
//  b.x() , this b
console.log(b.x(5)); // 5

코드를 수정한 후에 b 대상이 a.x를 인용하는 방법의 이름도 x여야 합니다. 귀속 함수는this를 사용하기 때문입니다.x 호출, 속성 이름은 x가 고정되어 죽었습니다.익명 귀속 함수에 이름을 지어서 이 이름을 호출하면 이 문제를 해결할 수 있습니다. 이런 익명 귀속 함수는 내연 함수 (이름이 있는 익명 함수) 라고 합니다.
//  , 
var a={
    x:function z(n){
        return n>1? z(n-1)+1:1;
    }
};
// b x , a x 
var b={
    y: a.x
};
a={};
console.log(b.y(5)); // 5

내연 함수는 변수에 값을 부여할 때도 사용할 수 있다
var a= function b(){
    console.log(b);  //  b
};
a();
console.log(b); //  ,b , 

arguments의callee 속성을 통해 함수 자체를 호출하는 방법도 있지만, callee는 새 버전의 자바스크립트에서 제거됩니다.현재 버전의 엄격한 모드에서도 이 속성을 사용하지 않습니다.arguments.callee는 현재 실행 중인 함수 자체를 인용합니다.
var a={
    x:function (n){
        return n>1? arguments.callee(n-1)+1:1;
    }
};
var b={
    y: a.x
};
a={};
console.log(b.y(5)); // 5

가변 길이 매개변수 목록


apply () 를 사용하면 함수의 매개 변수 목록 길이를 변경할 수 있습니다
// Javascript , , 。
var a= Math.max(1,2,3);
console.log(a); // 3

//  apply() , 
var a=[1,2,3];
var b=Math.max.apply(Math,a);
console.log(b); // 3

고정된 수량의 형식 매개 변수만 정의하더라도,arguments 매개 변수 목록으로 모든 매개 변수에 접근할 수 있습니다. 왜냐하면 argument 매개 변수 목록은 항상 모든 매개 변수의 집합을 가리키기 때문입니다.함수 자체도length속성을 가지고 있다.arguments속성의length와 달리 함수 자체의length는 함수를 정의할 때 몇 가지 형식의 매개 변수를 정의하고,arguments의length속성은 실제 호출 함수를 나타낼 때 몇 개의 매개 변수를 전송한다.이 두 length의 차이를 이용하여 자바스크립트에서 함수의 재부팅을 실현할 수 있다.
//  , , 
function add(obj, name, fn) {
    var old=obj[name];
    obj[name]=function () {
        if(fn.length===arguments.length){
            return fn.apply(this,arguments);
        }else if(typeof old==="function"){
            return old.apply(this,arguments);
        }
    }
}

var a={};
add(a,"b",function () {
    console.log(0);
});
add(a,"b",function (x) {
    console.log(x);
});
add(a,"b",function (x,y) {
    console.log(x+y);
});

//  , 
a.b();  // 0
a.b(1);  // 1
a.b(1,2);  // 3

함수 판단


각 브라우저와 호환되는 함수 판단 방법:
function isFunction(fn){
    return Object.prototype.toString.call(fn)==="[object Function]"
}

좋은 웹페이지 즐겨찾기