2014-01-24 2 views
1

아래 코드에서 "test"인수를 콜백에 전달하려고합니다. 좋은 소식은 콜백이 실제로 호출되고 있다는 것입니다. 그러나 "I see test"대신 "I undefined"문자열이 인쇄됩니다.콜백 인수가 전달되지 않음 (Node.js)

var MyObject = function(){ 
} 

MyObject.prototype.b = function(data){ 
    console.log("I see " + data); 
} 

a = function(callback){ 
    callback("test"); 
} 

var it = new MyObject(); 
a(function(){it.b()}); 

은 내가 문자열을 볼 수 있기 때문에 내가 직접 ("테스트") it.b를 호출하는 경우 인쇄 된 "나는 시험을 볼", 그것은 폐쇄와 함께 할 수있는 뭔가가 직감이있다. 함수가 인수를 제대로 수신하지 않는 이유는 무엇입니까?

답변

4

it.b()을 인수없이 호출하기 때문에 b() 메서드를 사용할 때 인수가 없음이 놀라운 일이 아닙니다. 인수가 it.b()으로 나타나게하려면 콜백에 선언해야하므로 it.b(arg)에 전달하면됩니다. 당신이 .bind()을 사용할 수,

a(function(){ 
    it.b.apply(it, arguments) 
}); 

을 또는 :

a(function(arg){ 
    it.b(arg) 
}); 

또는, 당신은 콜백에서 모든 인수를 전달할 수 있습니다.

a(it.b.bind(it)); 
+0

아, 내가 볼 ... 나는이 (it.b) 작동하지 않을 것입니다 알고 있었다, 그래서 나는 맹목적으로 기능 재료를 넣어 나는 다른 사이트에서 그걸 보았 기 때문에 주위를 둘러 보았습니다. 나는 그것이 단지 특별한 문법이라고 생각했지만, 이제 실제로 그것이 새로운 무명 기능을 생성하고 있음이 분명하다. 감사. –

2

콜백으로 전달할 새로운 익명의 함수를 만드는 것처럼 보입니다. 마지막 줄을 다음과 같이 변경하면

a(it.b); 

예상대로 작동합니다.

+1

이것은 인수를 얻지 만,'this'는'b' 메소드 안에있는'it' 객체가 아닙니다. – jfriend00

+0

물론, 그가'this'를'it' 객체로 필요로한다면, 그는 그것을 그대로 바인딩해야합니다. – David

2

이 코드의 마지막 줄에 분석 할 수 있습니다 : 당신이에 아규먼트로 함수 XYZ를 전달하는

a(function(){it.b()}); 

//I will name the above function 'xyz' for convenience 
a(function xyz(){it.b()}); 

위의 줄에서을(). 전달하는 함수는 직접 매개 변수를 전달하지 않고 it.b()를 호출합니다.

xyz를 a로 전달하면 xyz라는 문자열이 test라는 문자열을 매개 변수로 사용하여 호출됩니다. 즉 xyz ("test")가 호출됩니다. 그러나이 문자열 "test"는 어떤 데이터도 전달하지 않고 it.b()를 직접 호출하므로 '정의되지 않음'을 얻습니다.

원하는 출력을 얻으려면 다음 두 가지 방법 중 하나를 사용하여 코드를 작성해야합니다.

방법 1 :

var MyObject = function(){ 
} 

MyObject.prototype.b = function(data){ 
    console.log("I see " + data); 
} 

a = function(callback){ 
    callback("test"); 
} 

var it = new MyObject(); 
a(it.b); 

방법 2 :

var MyObject = function(){ 
} 

MyObject.prototype.b = function(data){ 
    console.log("I see " + data); 
} 

a = function(callback){ 
    callback("test"); 
} 

var it = new MyObject(); 
a(function(data){it.b(data)}); 
관련 문제