손으로 쓰는 기능.bind 함수

3107 단어
if(!Function.prototype.bind){
  Function.prototype.bind = function(oThis){
if (typeof this!=="function") {//함수 없이 이상을 던지면
      throw new TyperError("")
    }
    var aArgs = Array.prototype.slice.call(arguments, 1),//여기 있는 aArgs는 함수를 제외한 매개 변수입니다
fToBind =this,//바인딩할 객체
      fNOP = function(){},
      fBound = function(){
        return fToBind.apply(
          this instanceof fNOP ? this:oThis||this,aArgs.concat(Array.prototype.slice.call(arguments)));
          )
      };
    fNOP.prototype = this.prototype;
    fBound.prototype = new fNOP();
    return  fBound;
  }
} bind의 용법을 이해하려면 apply의 용법을 알아야 한다. MDN은 apply는 함수 내부의 지향을 첫 번째 매개 변수로 직접 수정하고 두 번째 매개 변수 그룹을 함수에 넣고 이 함수를 운행한다고 지적했다.그러니까
var obj = {test: function() { console.log(this, arguments) }}, func = obj.test; obj.test("Hello", ",", "world", "!"); func.apply(obj, ["Hello", ",", "world", "!"]); 

이 두 가지 운행 방식은 같다.그러면 Polyfill로 돌아가서 발견한 매개 변수의 쓰기 방법은 args.concat(slice.call(arguments)) 입니다.argsbind 때 정의된 첫 번째 파라미터를 제외한 다른 파라미터이고, 이때arguments는 함수가 호출될 때의 파라미터를 가리키며, 수조의 조작을 통해 이 두 파라미터를 하나의 수조로 합쳐서 함수 내부로 전달한다.예를 들면 당신은 더 쉽게 이해할 수 있습니다.
/**   **/ var newFunc = func.bind(obj, "Hello", ","); newFunc("world", "!"); 

그러면 다시 한 번 질문에 대답하겠습니다. 하나, 이것은 전형적인 속성 계승 방법입니다. 원래 사용합니다.
bound.prototype = self.prototype 

원속성을 집적할 수 있지만 이렇게 두 대상의 속성이 모두 같은 곳을 가리키면 수정bound.prototype도 변화할 수 있다. 이것은 우리의 본의가 아니다.그래서 하나의 공함수self.prototype를 통해 중전을 하면 이런 상황의 발생을 효과적으로 방지할 수 있다.
 
bind는 함수를 되돌려줍니다.
if (!Function.prototype.bind) {
    Function.prototype.bind = function(obj) {
        var _self = this ,args = arguments; return function() { _self.apply(obj, Array.prototype.slice.call(args, 1)); } } }

좋은 웹페이지 즐겨찾기