@Evelate

Как js понимает, какую именно ссылку удалить в EventEmmiter?

const EventEmitter = require('events');

const eventEmitter = new EventEmitter();

function test(txt, second){
  function secondFunc(text){
    setTimeout(() => {console.log(txt); eventEmitter.off('run', secondFunc)}, second);
  }
  return secondFunc;
}
eventEmitter.on('run', test('1', 5000));
eventEmitter.on('run', test('2', 1000));
eventEmitter.on('run', test('3', 7000));

eventEmitter.emit('run', new Date().getSeconds().toString()); //Вывод: 2,1,3

setTimeout(() => eventEmitter.emit('run', new Date().getSeconds().toString()), 3000); //Вывод: 1,3
setTimeout(() => eventEmitter.emit('run', new Date().getSeconds().toString()), 6000); //Вывод: 3


Что-то не могу на гуглить...

Как js уникализирует ссылки на функции secondFunc? Ведь, когда в eventEmitter.off передается текст и ссылка на функцию, то 'run' один и тот же, также как и название функции secondFunc, также как и название функции test. Как js понимает, какую именно ссылку удалить, когда всё одинаково? Хочу чуть лучше понять ссылочный тип)

Пока писал вопрос мысль возникла, что как-то через this, возможно, но буду рад за понятное разъяснение :)
  • Вопрос задан
  • 121 просмотр
Решения вопроса 2
MvcBox
@MvcBox
Software Engineer [C/C++/JS(for Node.js)/etc]
При каждом вызове test создается новый экземпляр функции secondFunc.64ca9dc9ad32c372704924.jpeg
Ответ написан
Stalker_RED
@Stalker_RED
Похоже, вы исходите из ошибочного предположения, что движок js смотрит на имена переменных, а не на их значения. Функции каждый раз разные, а имя не важно.
Для наглядности дадим этим функциям случайные имена и выведем их в консоль:
const EventEmitter = require('events');

const eventEmitter = new EventEmitter();

const myFuncs = {};

function test(txt, second){
    const funcName = makeid(5);
    myFuncs[funcName] = function(text){
    setTimeout(() => {
        console.log(txt);
        eventEmitter.off('run', myFuncs[funcName]);
        console.log('function ' + funcName + ' off');
    }, second);
  }
  console.log('function ' + funcName + ' created');
  return myFuncs[funcName];
}
eventEmitter.on('run', test('1', 5000));
eventEmitter.on('run', test('2', 1000));
eventEmitter.on('run', test('3', 7000));

eventEmitter.emit('run', new Date().getSeconds().toString()); //Вывод: 2,1,3

setTimeout(() => eventEmitter.emit('run', new Date().getSeconds().toString()), 3000); //Вывод: 1,3
setTimeout(() => eventEmitter.emit('run', new Date().getSeconds().toString()), 6000); //Вывод: 3


// based at https://stackoverflow.com/questions/1349404/generate-random-string-characters-in-javascript
function makeid(length) {
    let result = '';
    const characters = 'abcdef';
    const charactersLength = characters.length;
    let counter = 0;
    while (counter < length) {
      result += characters.charAt(Math.floor(Math.random() * charactersLength));
      counter += 1;
    }
    return result;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы