2011-10-19 1 views
13

많은 콜백을 사용하는 JavaScript 애플리케이션이 있습니다. 일반적인 함수는 콜백을 취해 다른 콜백으로 래핑합니다. 상기 예 감안 언제 call()을 사용해야합니까? 함수를 직접 호출해야합니까?

Namespace.foo = function(arg, their_on_success) { 
    var my_on_success = function(result) { 
     console.log('my_on_success() called'); 
     if('function' === typeof their_on_success) { 
       their_on_success(result); 
     } 
    } 
    something(arg, my_on_success); 
}; 

때해야 이러한 설정 우리 오히려 their_on_success() 호출과 함수 호출을 통해 결과를 전달보다 네이티브 call() 방법 (두 번째 인수로 결과 VAR 전달)? 당신은 함수 내에서 this의 값을 설정하려는 경우입니다

var obj = {a: 0}; 
method.call(obj, "parameter"); 
function method(para) { 
    this.a == 0; // true <-- obj is now this 
} 

답변

19

()를 호출하면 함수의 값을 변경하는 데 사용됩니다 .

글쎄, apply은 매개 변수 배열을 허용하므로 다른 경우에 유용 할 수 있습니다. 함수의 call() 방법을 사용하여

7

유일한 이유는 call (또는 apply)를 사용하는 :

+1

'apply '의 주된 경우는 가변 인자를 다룰 때 사용됩니다. 따라서'arguments'를 전달할 수 있습니다. –

3

당신이 함수의 실행 중에 this로 함수에 바인딩 된 객체를 변경 할 수 있습니다 - 콜백 함수 경우이 또한 상황

their_on_success.call(myContext, results) 

라고하지만됩니다 this에 의존하지 않으므로 어떤 방식 으로든 전화를 걸면 아무런 차이가 없습니다.

3

좋은 예는 콜백이 필요한 함수를 구현할 때입니다. OO 코드를 작성할 때 호출자가 콜백을 호출 할 컨텍스트를 지정할 수 있도록하려고합니다.

function validateFormAjax(form, callback, context) { 
    // Using jQuery for simplicity 
    $.ajax({ 
    url: '/validateForm.php', 
    data: getFormData(form), 
    success: function(data) { 
     callback.call(context, data); 
    } 
    }); 
} 

내 예를 들어 그냥 $.ajax 통화에 컨텍스트 매개 변수를 전달하여 구현 될 수있다 참고하지만, 그 (전화를 사용하는 call

1

또 다른 케이스를 사용에 대해 많이 보여주지 것)을 할 때입니다 개체의 메서드가 대체되지 않았거나 실제로 메서드에서 실행하고 싶지 않다는 것을 알 수없는 환경에 있습니다. hasOwnProperty는 종종 그러한 메소드입니다. javascript 객체가 자신 만의 hasOwnProperty 메소드를 가질 수없는 곳이 많기 때문에 hasOwnProperty.call (obj, propertyName)을 신중해야합니다.

+1

나는 당신이 말하는 것을 얻지 만 그것이 향상 될 수 있다고 생각합니다. 뭔가 : 자바 스크립트는 프로토 타입을 전혀 지정하지 않고 ('Object.create (null)'), 네이티브 객체의 프로토 타입이나 객체 자체의 프로퍼티를 오버라이드 할 수있게 해줍니다. 그러므로, 안전을 위해서, 당신의 코드가 총알 증명을 위해'Object.prototype.hasOwnProperty.call (obj, 'someProp')'을 사용해야한다. –