2013-08-01 3 views
2

약간의 코드로 시작하겠습니다. 의 객체를 보자 : 컨텍스트를 전달하는 데 통화/적용이 바람직합니까?

function SomeObject() { 
    this.arbitraryVarINeed = 5; 
} 

지금 한 가지 방법은 다음과 같습니다

SomeObject.prototype.stuffToBeDone() { 
    var context = this; 
    function heyThere() { 
     console.log(context.arbitraryVarINeed); 
    } 
    heyThere(); 
} 

과 다른 :

SomeObject.prototype.stuffToBeDone() { 
    function heyThere() { 
     console.log(this.arbitraryVarINeed); 
    } 
    heyThere.call(this); 
} 

지금이 간단한 예에서, 호출은 분명히 바람직 할 것이다. 그러나 이것에 대해서, .call/.apply도 적용 가능합니까?

SomeObject.prototype.stuffToBeDone() { 
    var hello = document.createElement("brofist"); 
    var context = this; 
    hello.onBroEvent = function (event) { 
     event.target.innerBro = context.arbitraryVarINeed; 
    } 
} 

그리고 반복 .call 사용 사이에서 선택해야하는 경우/.apply하거나 상황에 맞는 내가 전자 또는 후자 가야, 어딘가에 저장 저장? 빠른 옵션 인 안전한 옵션은 다른 두 방법보다 훨씬 단순한 두 가지 방법 중 하나입니다.

Jakob의 대답 덕분에 이벤트/anon 함수 예제도 .bind를 통해 해결할 수 있습니다. 결국 컨텍스트를 전달할 필요가 전혀 없습니까?

답변

1

질문에 대한 완전한 답변이 아니지만 마지막 예는 세 번째 방법입니다. 당신이 자신을 짐작 한 것처럼, 당신은 정말 call/apply를 사용할 수 없지만 bind을 사용할 수 있습니다 : 이것처럼 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

을 :

SomeObject.prototype.stuffToBeDone() { 
    var hello = document.createElement("brofist"); 
    var context = this; 
    hello.onBroEvent = (function(event) { 
     event.target.innerBro = this.arbitraryVarINeed; 
    }).bind(this); 
} 
+0

바인딩은 기본적으로 그냥 비록 폐쇄 컨텍스트를 저장한다. IIRC, bind는 다음과 같이 polyfilled 될 수 있습니다 (명확성을 위해 프로토 타입을 사용하지 않음) : function bind (fn, target) {return function() {return fn.call (target, arguments); }}'. – Alxandr

+0

당신은 내가 찾고있는 것을 더 많이 또는 더 적게 가지고 있습니다. 심지어 그 질문은 답이없는 채로 남아 있습니다. 나는 그것이 곧 바뀔지는 모르겠다. 그래서 여기에 간다. – Fenixp

관련 문제