js 시 뮬 레이 션 구현 call, apply, bind

9092 단어 자바 script
Function.prototype.call()
문법
fun.call(thisArg, arg1, arg2, …)
매개 변수
  • thisArg

  • fun 함수 가 실 행 될 때 지정 한 this 값 입 니 다.주의해 야 할 것 은 지정 한 this 값 이 반드시 이 함수 가 실 행 될 때 진정한 this 값 은 아 닙 니 다. 이 함수 가 non - strict mode 에 있 으 면 null 과 undefined 로 지 정 된 this 값 은 자동 으로 전체 대상 (브 라 우 저 에서 window 대상) 을 가리 키 는 동시에 값 이 원시 값 (숫자, 문자열, 불 값) 인 this 는 이 원시 값 의 자동 포장 대상 을 가리 키 는 것 입 니 다.arg 1, arg 2, 지정 한 매개 변수 목록 입 니 다.
    반환 값
    호출 자가 제공 하 는 this 값 과 매개 변 수 를 사용 하여 이 함수 의 반환 값 을 호출 합 니 다.이 방법 이 값 을 되 돌려 주지 않 으 면 undefined 로 돌아 갑 니 다.
    Function.prototype.apply()
    문법
    func.apply(thisArg, [argsArray])
    매개 변수
  • thisArg

  • 선택 적func 함수 가 실 행 될 때 사용 하 는 this 값 입 니 다.this 는 이 방법 에서 보 이 는 실제 값 이 아 닐 수 있 습 니 다. 이 함수 가 엄격 하지 않 은 모드 에 있 으 면 null 또는 undefined 로 지정 할 때 전역 대상 으로 자동 으로 바 뀌 고 원본 값 은 포 장 됩 니 다.argsArray 에서 선택 할 수 있 습 니 다.하나의 배열 이나 클래스 배열 대상, 그 중의 배열 요 소 는 단독 매개 변수 로 func 함수 에 전 달 됩 니 다.이 매개 변수의 값 이 null 또는 undefined 라면 어떠한 매개 변수 도 들 어 올 필요 가 없다 는 것 을 의미 합 니 다.ECMAScript 5 부터 클래스 배열 대상 을 사용 할 수 있 습 니 다.
    반환 값
    this 값 과 매개 변 수 를 지정 한 함수 의 결 과 를 호출 합 니 다.
    Function.prototype.bind()
    문법
    function.bind(thisArg[, arg1[, arg2[, …]]])
    매개 변수
  • thisArg

  • 바 인 딩 함 수 를 호출 할 때 this 매개 변수 로 목표 함수 에 전달 하 는 값 입 니 다.new 연산 자 구조 바 인 딩 함 수 를 사용 하면 이 값 을 무시 합 니 다.bind 를 사용 하여 setTimeout 에서 함 수 를 만 들 때 (리 셋 으로 제공) thisArg 로 전달 하 는 모든 원시 값 은 object 로 변 환 됩 니 다.bind 함수 의 매개 변수 목록 이 비어 있 으 면, 역할 영역 을 실행 하 는 this 는 새로운 함수 의 thisArg 로 간 주 됩 니 다.arg 1, arg 2,... 목표 함수 가 호출 될 때 바 인 딩 함수 의 매개 변수 목록 에 미리 추가 합 니 다.
    반환 값
    원 함수 의 복사 본 을 되 돌려 주 고 지정 한 this 값 과 초기 인 자 를 가지 고 있 습 니 다.
    시 뮬 레이 션 은 다음 과 같 습 니 다.
    
    Function.prototype.mycall = function(context) {
    	var context = context || window;
    	//  context      
    	context.fn = this;
    	//     
    	var args = [...arguments].slice(1);
    	//      
    	var result = context.fn(...args);
    	//   fn	
    	delete context.fn;
    	//       
    	return result;
    }
    
    Function.prototype.myapply = function(context) {
    	var context = context || window;
    
    	context.fn = this;
    
    	var result = null;
    
    	if(arguments[1]) {
    	
    		result = context.fn(...arguments);
    		
    	}else {
    	
    		result = context.fn();
    		
    	}
    	
    	delete context.fn;
    
    	return result;
    }
    
    Function.prototype.mybind = function(context) {
    	if(typeof this !== 'function') {
    	
    		throw new TypeError('Error');
    		
    	}
    	
    	var _this = this;
    
    	var args = [...arguments].slice(1);
    
    	return function F() {
    	
    		if(this instanceof F) {
    		
    			return new _this(...args, ...arguments);
    			
    		}
    		
    		return _this.apply(context, args.concat(...arguments));
    		
    	}
    }
    

    좋은 웹페이지 즐겨찾기