2013-08-14 3 views
0

Function.prototype.bind에 대한 MDN 문서를 열었지만 스크립트가 여전히 작동하지 않습니다.javascript : 이벤트에서 "this"범위를 변경하는 방법

this은 addEventListener에 추가 된 htmlElement를 참조합니다. 문제는 내 this이 개체 창을 참조하는 이유입니다.

var handle1 = document.getElementById('handle1'), 
    handle2 = document.getElementById('handle2'); 

function doLogin() { 
    alert(this); 
} 

function enterForm(ev) { 
    if (ev.which === 13) { 
     doLogin(); 
    } 
} 

handle1.addEventListener('click', doLogin, false); 
// this alert: [object HTMLButtonElement] this is what i want 


handle2.addEventListener('keyup', enterForm, false); 
// this alert: [object Window] this is what i do not want 

그래서, 어떻게이 문제를 해결하기 위해 여기

바인드 (http://jsbin.com/ejimor/1/edit)없이 스크립트입니까?

+3

어떻게'bind'를 사용하려고 했습니까? – Ryan

+0

가장 쉬운 해결책은 호출에서'ev' 또는'this'를 그냥 전달하는 것입니다 :'doLogin (ev);'. 또는 '호출'또는 '적용'을 사용하여 수신자를 명시 적으로 설정할 수 있지만 이는 단순한 문제를 지나치게 복잡하게 만듭니다. – Amadan

+0

또한 폼의 제출을 ​​가능한 두 가지 방식으로 처리하려고합니다. 한 번'submit' 이벤트를 처리하지 않는 이유는 무엇입니까? – Ryan

답변

3

트릭은 당신이 enterForm가 호출되는 상황에서 doLogin를 호출 할 것입니다 - 그것을 위해 당신이 call 또는 apply가 사용할 수 있습니다

function enterForm(ev) { 
    if (ev.which === 13) doLogin.call(this); 
} 

callapplythis 함수의 내부가 있는지 확인 (예를 들어, doLogin.call({x: 1})을 호출하고 이라는 경고를받을 수있는) 첫 번째 인수로 설정됩니다.

당신은 항상 doLogin를 원하는 경우에

은 다음 bind를 사용하여 동일한 기능의 바운드 버전의 기능을 대체 할 수 HTMLButtonElement의 컨텍스트에서 호출 할 :

function doLogin() { alert(this); } 
doLogin = doLogin.bind(handle1); 

bind는의 새 버전을 생성 함수를 호출하고 전달 된 첫 번째 인수에 this이 영구적으로 바인딩되어 있습니다. 그래서, 같은 맥락에서, 우리는 그랬다면이 :

var newLogin = doLogin.bind({x: 1}); 

이 익명의 {x: 1} 개체에 설정된 this 컨텍스트로 호출됩니다 우리가 newLogin를 호출 할 때마다 (우리가했던 경우에도 newLogin.call(12) 또는 newLogin.apply(someObject))

+0

고맙다. 다시 감사합니다 –

+0

와우 .... 좋은 대답 .. 이것은 매우 도움이됩니다. –

관련 문제