2010-12-23 2 views
0

XBL에 대해 말하는 것은 자바 스크립트에 대해 정확히 말하는 것이 아닙니다. 그래서 this one과 관련된이 질문을 만들지 만, XBL에 관해서는 루트 Javascript 코드의 작성자는 아니지만 바인딩 내부의 메서드와 이벤트 핸들러에 대해서만 설명합니다.XBL에서 javascript의 "this"오류를 피하기위한 최선의 방법

- 어떤 경우에는

this 키워드는 내가가 기대하는 오브젝트를 참조하지 않을 수 있습니다. (최근의 예 : 이러한 종류의 실수를 방지하기 위해 가장 좋은 방법을 무엇 in an key event, in my XBL)

지금은

, 난 항상 사용하고있어 getElementById (또는 jQuery를에서 $.fn), 그러나 나는 그것이를인지 확실하지 않다 가장 좋은 방법

--update

조금 자세한 내용 :. XBL method있는 유일한 방법은 내

"this"를 사용하지 않고 Xul 파일 (GUI 설명 파일)에 정의 된 요소에 액세스하려면 getElementById를 사용하십시오. 그러면 코드를 재사용 할 수 없으므로, 대체물을 찾고 있습니다.

답변

1

다른 곳에서들은 것처럼, 문제는 this 매개 변수가 반드시 처음 생각한 개체 일 필요가 없다는 것입니다. 특히 이벤트 처리기와 관련하여 이야기 할 때 특히 그렇습니다. 내가 찾은 가장 좋은 방법은 어떤 객체를 this 변수로 묶고 바인딩을 사용하여 원래 함수를 호출하는 다른 함수를 반환하는 작은 함수를 작성하는 것입니다.

이 코드를 살펴 보자 내가 가지고있는 것은 (self이라고도 함)가 객체와 일부 기능을한다 bindFunction라는 기능이 있으며, 전달 된 함수를 호출하는 다른 함수를 반환

var bindFunction = function(self, f) { 
    return function() { 
    return f.apply(self); 
    }; 
}; 

var foo = function() { 
    alert(this.hello); 
}; 

var bar = { 
    hello: "Hello there" 
}; 

var boundFoo = bindFunction(bar, foo); 
boundFoo(); 

self 개체를 this 변수로 적용합니다. this.hello을 경고하는 foo 기능, hello 멤버와 bar 객체와 방법 barfoo을 결합 할 수 있습니다

코드의 나머지 부분은 단지 몇 가지 테스트 코드입니다.

본질적으로 매개 변수를 허용하지 않고 첫 번째 매개 변수가 항상 올바른 this 변수로 호출되도록하는 다른 함수를 생성했습니다. 이벤트 핸들러에 이상적입니다.

는 (미안하지만, 내가 XBL에 대해 아무것도 몰라, 그래서이 사용 될 것입니다 바랍니다.)

+0

'bind'는 ECMA 스크립트 5에 내장되어, 새로운'strict' 모드'이 많이 있습니다 '문제가 빠르다. –

+0

답변을 주셔서 감사합니다. 귀하의 예에서 "자기"로 사용할 "막대"가 있지만 [XBL 방법] (https://developer.mozilla.org/en/XUL_Tutorial:Adding_Methods_to_XBL-defined_Elements) 내에서 유일한 방법은 [Xul] (https://developer.mozilla.org/en/XUL) 파일 (GUI 설명 파일)에 정의 된 요소에 액세스하려면 getElementById가 있어야하며 코드를 재사용 할 수 없으므로 대안을 찾고 .. –

+1

작성하는 대신 otherDoc.addEventListener ("event", this.myMethod, false); 이제 otherDoc.addEventListener ("event", this.bindFunction (this, this.myMethod), false);를 작성합니다. – Neil

0

을 가장 좋은 대답이 아니라면, 좋은 방법이 사용 될 수있다 자바 스크립트 구현 대신 XBL의 파일입니다. Xulrunner 소스 코드를 보면 대부분의 코드가이 작업을 수행합니다.

하지만 난 여전히 그것으로 잘 작동 할 수있는 방법이 있다면, XBL을 사용하고 싶습니다 ..

관련 문제