2012-05-20 5 views
0

나는() event.js 한번의 구현을 찾고 있어요 :

EventEmitter.prototype.once = function(type, listener) { 
    if ('function' !== typeof listener) { 
    throw new Error('.once only takes instances of Function'); 
    } 

    var self = this; 
    function g() { 
    self.removeListener(type, g); 
    listener.apply(this, arguments); 
    }; 

    g.listener = listener; 
    self.on(type, g); 

    return this; 
}; 

가) (당신이 some_object.once('on', function(){ console.log(this); });

임시 함수 g을 할 것이라는 점을 기억 self.removeListener(type,g)있다. g()의 컨텍스트가 틀리면 틀릴 것이기 때문입니다. 그러나, 선이 그 후, 변수 this이 ... listener.apply(this, arguments);에 사용되지만,하지이 다음 listener(arguments)?

다음

아래로 약간에 글로벌 컨텍스트를 통과, 그것은 self.on 대신하는 경우 this.on를 실행합니다.

지금 ... 혼란 스럽습니다. Javascript를 처음 접했을 때 문맥에 여전히 혼란 스럽습니다. 하지만,이 코드는 바나나를 몰고 있습니다. 누군가 제게 여기 계몽 해 주실 수 있습니까?

감사합니다.

머. this는 주어진 함수 호출에서 원하는처럼, 당신은 self에 저장된 사본을 참조하고 항상에 액세스 할 수 있습니다 설정되지 않습니다 때

답변

1

귀하의 예제에서 self 같은 this의 사본을 사용하는 이유입니다.

자바에서는 .call() 또는 .apply()으로 명시 적으로 설정하지 않는 한 this이 호출 컨텍스트에 의해 설정됩니다.

정상적인 함수 호출로 인해 this이 전역 개체로 설정됩니다.

x.once()과 같은 메서드 호출을 사용하면 개체로 once() 메서드의 this이 설정됩니다.

특정 경우에 g()이 콜백 기능으로 사용됩니다. 따라서 this은 해당 콜백 함수의 호출자에서 사용 된 컨텍스트에 의해 설정됩니다. 그러나 해당 컨텍스트가 원하는대로 아니며 g()EventEmitter 개체에 대한 액세스 권한을 갖고 자한다면 g()이있는 클로저에 저장된 self 참조를 사용할 수 있습니다. self에 저장된 참조가 없으면 g()이 될 수 있습니다. g() 함수 안에있는 this 함수가 다른 것으로 설정되어 있기 때문에 원하는 값에 액세스 할 수 없습니다. 나는이 .once() 방법의 의도를 따르는 경우 .on()g()를 호출 할 때 필요에 따라 this가 설정되도록하기 때문에

는, 그때는 self 참조에 대한 이유가 없다. 이 경우 콜백이 사용될 때 안전하게 작동하는 컨벤션 일 수도 있습니다 (이 특정 코드에서는 엄격하게 적용되지는 않지만) this이 원하는대로 설정됩니다.

this.on() 대신 self.on()을 호출하는 경우 실행에 차이가 없습니다. this의 값은 주어진 함수 컨텍스트 내에서 변경되지 않습니다.this을 로컬 변수에 할당 한 라이브러리 중 일부는 로컬 변수를 최소화 할 때 로컬 변수의 이름을 단일 바이트 값으로 바꿀 수 있기 때문에 최소화 할 때 수 바이트를 저장할 수 있기 때문에 로컬 변수를 참조하지만 this 값은 될 수 없습니다. 이름이 바뀌 었습니다. g() 함수가 가능성으로 설정 자체에 저장된 참조 함수 g() 원하는 값에 액세스 할 수없는 수없이이 때문에 내부 "에 대해 What is the value of var me = this;

+0

: 여기

는 더 이상 논의와 관련 포스트 다른 것." ... 나는 이것에 대해 잘 모르겠다. events.js의 코드를 읽는 중,'EventEmitter.prototype.emit()'은'... listeners [i] .apply (this, args); '를가집니다. 그래서 호출자의'this'는 여전히 객체와 동일합니다 ...? 나는 그 기능에서 '그'의 요지를 전혀 보지 못했다. [events.js] (https://github.com/joyent/node/blob/master/lib/events.js) 라인 114 (전화)와 184 ('once()'참조) – Merc

+0

@Merc - 나는 '내가 따라하면 ... '과 같은 문단. 나는 코드 자체를 만들기 위해해야하기 때문에 "self"가 단지 컨벤션이나 최소화를위한 목적으로 진행되고 있다고 생각한다. – jfriend00

+0

당신은 똑같은 말을했습니다 ...! 좋아, 그래서 나는 미치지 않을거야. 고맙습니다! (답변 가능) – Merc

관련 문제