2. 휘두르기 함수
익명 함수
익명 함수를 만드는 경우 일반적으로 익명 함수를 변수에 저장하거나 대상으로 삼거나 리셋합니다.
//
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]"
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.