2012-01-22 5 views
3

나는 다음과 같은 한 자바 스크립트 객체 :이 자바 스크립트에 매개 변수로 함수를 전달

function Alfa() { 
    this.status=''; 
    this.setStatus = function(value) { 
    this.status=value 
    } 
} 

function Beta() { 
    this.setSomething = function(setter) { 
    setter('Something'); 
    } 
} 

과 실행 이상 :

alf=new Alfa(); 
alf.setStatus('foo'); 

당신이 ALF의 값으로 보면이 잘 작동의 상태가 인 경우 'foo'로 설정되지만,

bet=new Beta(); 
bet.setSomething(a.setStatus); 
내가 기대 한 무엇

내기ALF대해 setStatus 기능을 실행하고 '무엇인가'에, 그러나, 이런 일이되지 상태 값을 설정하는 것입니다. 대해 setStatus는 ALF의 실행되지만,이 창ALF 인스턴스하지만 하지 점 때문에 속성 상태 ALF 아니윈도우 설정된다.

원하는 기능을 얻으려면 적절한 방법은 무엇입니까?

은 실제 생활에서 내가 이벤트 핸들러에 ALF의 이러한 기능을 전달하려면, 물론 간단하게 구현이다, 그래서 나는 베타를 예를 들어 구현, 변경할 수 없습니다 :

$('xxx').click(alf.setStatus) 
+0

적어도 하나 이상의 오류가 발생할 수 있습니다. 즉, a.setStatus를 bet.setSomething()에 전달했으나 어디에서 선언 했습니까? –

답변

4

자바 스크립트 기능 언 바운드를 . 즉, this은 정의 방법보다는 호출 방법에 따라 결정됩니다. 당신이 bet 내에서 메소드를 호출하기 때문에, 다음 thisbet

당신이 상관없이 함수가 호출되는 방법을 안정적 this을 생성하지 않는 바인딩 기능를해야이 문제를 얻는 것입니다. Function.bind

alf.setStatus.bind(alf) 

을 또는 당신은 나이가 통역에서이 기능을 제공하는 여러 ES5 심가이 arent 경우 : 당신은 ES5 호환 자바 스크립트 인터프리터를 사용하는 경우

당신은 사용할 수 있습니다. 실제로 하나는 bind에 대한 mdn 참조에 제공됩니다. JQuery에는 $.proxy이라는 버전이 있습니다.

간단한 구현은 함수와 범위를 사용하는 함수를 원한다는 것입니다. 그런 다음이를 사용하지 않고 해당 범위에서 메서드를 호출합니다. 뭔가.

function bind(func,o) { return function() { func.call(o); } } 
+0

올바른 것은'alf.setStatus.bind (alf)'입니다. 구문은'fn.bind (context)'입니다. –

+0

예. 죄송합니다. 나는 기차에 타고 내 전화에 이걸 입력하려고합니다. 자동 수정은 또한 내 몇 번있어. 편집하기. –

+1

+1은'$ .proxy'를 언급하는데, 보통 underscore.js'_.bind()'를 사용합니다. –

1

JavaScript의 함수에는 문맥이 첨부되어 있지 않습니다. Python에서 바운드 메소드.그래서 당신이 할 수있는 것은이 같은 맥락에 대해 setStatus 함수를 호출하는 것입니다 setter('Something');setter.call(this, 'Something');에 일이 될 것입니다

bet.setSomething(function(value) { 
    a.setStatus.call(a, value); 
}); 

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call

+0

"베타 구현을 변경할 수 없으므로" – KrzysDan

+0

또한 Beta 객체의 기능이 줄어 듭니다. – KrzysDan

1

변경합니다.

+0

"베타 구현을 변경할 수 없으므로" – KrzysDan

1
function Alfa() { 
    this.status=''; 
    this.setStatus = function(value) { 
     this.status=value 
    } 
} 
function Beta() { 
    this.status=''; 
    this.setSomething = function(setter) { 
     setter.call(this,'Something'); 
    } 
} 
관련 문제