2011-09-02 4 views
2
Function.prototype.bind = function() { 
    var _this = this, 
     original = _this, 
     args = Array.prototype.slice.call(arguments), 
     _obj = args.shift(), 
     func = function() { 
      var _that = _obj; 
      return original.apply(_that, args.concat(
      Array.prototype.slice.call(
      arguments, args.length))); 
     }; 
    func.bind = function() { 
     var args = Array.prototype.slice.call(arguments); 
     return Function.prototype.bind.apply(_this, args); 
    } 
    return func; 
}; 

나는 그것이 bind 함수라는 것을 알고있다. 그러나 나는 그것이 무엇을하고 있는지, 특히 args.concat 부분을 이해하지 못합니다. concat의 기능은 무엇입니까? 또한 .bind 메서드는 무엇을합니까 .apply.call 할 수 없습니까?이 코드는 어떤 기능을합니까?

+0

'bind'는 함수를 호출하고,'call'과'apply'는 함수를 호출합니다. 그들은 다른 짐승입니다. 'bind'는 나중에 사용될 함수가 함수에 대한 인자를 바인딩하는 옵션과 함께 특정 컨텍스트와 함께 호출되도록하려는 경우에 사용됩니다. –

답변

3

bind 함수는 함수를 취해 항상이 특정 this 값에 바인딩되도록합니다. 가장 쉬운 예제는 이벤트 처리기입니다. 기본적으로 이벤트 처리기의 this 값은 window에 바인딩됩니다. 그러나의 당신은 청취자로서 객체의 방법을 사용한다고 가정 해 봅시다, 그 청취자의 일부 속성을 변경 : thing.answer의 대신 온로드 이벤트에

var thing = { 
    answer : 4, 
    listener : function() { 
     this.answer = 42; 
    } 
} 
window.onload = thing.listener; 

의도처럼 변경되고, window.answer 지금 그래서 42입니다 우리는 bind 사용

window.onload = thing.listener.bind(thing); 

그래서, bind하지만 지정된 this 값이라고 할 때, 원래의 함수를 호출하는 함수를 반환합니다.

[].concat는 단순히 배열에 인수를 추가합니다 - 그래서 [].concat(5, 4) 반환 [5, 4][5, 4].concat([42]) 반환 [5, 4, 42]합니다. 이 경우 인수를 연결하는 데 사용됩니다. 함수가 호출 될 때 인수로 전달 될 bind 함수에 인수를 전달할 수 있습니다. 연결은 바인드 된 함수를 호출 할 때 현재 전달한 인수도 전달되도록 작동합니다.

2

Function.bind()에 대해서는 shim 인 것으로 보입니다.

하지만 이해가 안되며 구체적으로는 args.concat 부분입니다. concat는 무엇을합니까?

Array.concat() 연접 (AN Array뿐만 아니라 다른 값) 둘 이상의 Array S.

또한, .bind 방법은 .apply.call이 할 수없는 일을합니까?

this이 원하는대로 바인딩 된 함수에 대한 참조를 반환합니다.

var newFn = fn.bind(['a', 'b', 'c']); 

// This will call `fn()` with the above `Array` as `this`. 
newFn('first arg', 'second arg'); 

이미 설정된 인수를 가진 함수를 반환합니다 (thisbind()으로 설정하면 기본 인수를 설정할 수 있습니다).

+0

그것의 홀수 (또는 다른 어쨌든) 부분은 반환되는 함수에'.bind' 속성을 추가한다는 것입니다.'.bind()'를 호출하면, '.bind()'의 * result * 함수 인 prototype의'.bind()'는 음영 처리되며 항상 원래 함수에만 바인드됩니다. 이것은 표준'.bind()'에서 벗어난 것입니다. – user113716

+0

... 또 다른 이름으로 동일한 항목을 참조하면서 변수 2 개를 매우 이상하게 복제합니다. 그리고 원래의 바운드 인수와 같은 인덱스에있는 바운드 함수의 호출에 전달 된 인수를 버립니다. 아주 이상한 기능. – user113716

+0

@patrick 나는 그 복제물을 바로 보았다. 이상한. – alex

관련 문제