2013-05-03 2 views
1

Следующая node.js скрипт не работаетthis.emit не работает, но self.emit работает. Зачем?

var EventEmitter = require('events').EventEmitter; 
var util = require('util'); 

var TickE = function() {  
} 

util.inherits(TickE, EventEmitter); //TickE.prototype.__proto__ = EventEmitter.prototype; 

TickE.prototype.ticker = function() { 
    var self = this; 
    setInterval (function() { 
     self.emit('tick');  
    }, 1000); 
}; 

var t = new TickE(); 

//console.log (util.inspect(t)); 

t.on('tick', function() { console.log ('Tick...');}); 

t.ticker(); 

Это не работает, если я вызываю метод излучали как ниже

TickE.prototype.ticker = function() { 
    //var self = this; // commented this line 
    setInterval (function() { 
     this.emit('tick'); // using this in place of self 
    }, 1000); 
}; 

само это просто ссылка на переменную проведение этого и почему это ошибка бросания?

+1

Это было предложено так очень часто раньше. Пожалуйста, найдите 'this' и' javascript' в Google. Вы должны получить * тонны результатов. –

+0

@Golo: это может быть проблема - можете ли вы предложить хорошее и * правильное * чтение? – Bergi

+0

Например, см. Http://stackoverflow.com/a/134149/1333873 ... раздел «Как функция» –

ответ

5

Потому что the this keyword имеет другое значение в функции, которая вызывается setInterval.

Вы уже знаете, решение с переменной self в замыкании, другая (и короче) решение будет binding метод выделяют:

setInterval(this.emit.bind(this, "tick"), 1000); 
+0

95% моих проблем в JavaScript связаны с областью. Должен был знать ... – foszter

Смежные вопросы