javascript — передача process.stdout.write напрямую по сравнению с обратным вызовом дает другой вывод?

Передача process.stdout.write напрямую через обратный вызов дает другой вывод?

Когда вы передаете process.stdout.write в качестве аргумента, он считывает значение process.stdout.write и передает ПРОСТО указатель функции методу write . Затем, когда ls.staout.on() вызывает этот метод через некоторое время, он не привязан к process.stdout и не работает должным образом.

Вместо этого измените на это:

 ls.stdout.on("data", process.stdout.write.bind(process.stdout)); 

И он будет правильно привязан к нужному объекту при его вызове.

Посмотрите, как это установлено внутри вызова функции, чтобы получить сводную информацию о том, как this контролируется внутри функции.


В качестве более простого примера посмотрите это:

 class X { constructor(val) { this.val = val; } add(otherVal) { return this.val   otherVal; } } let x = new X(3); let fn = x.add; fn(5); // doesn't work properly 

Примеры вещей, которые будут работать правильно:

 let x = new X(3); x.add(5); // obj.method() sets proper value of this to obj in the method 

Или, если вы хотите обойти метод:

 let x = new X(3); let fn = x.add; fn.call(x, 5); // fn.call(x) artificially sets this to x inside the method 

Или это:

 let x = new X(3); let fn = x.add.bind(x); // creates stub function that calls method properly fn(5); 

Это также не будет работать, потому что когда вызывается fn(5) , нет привязки к объекту x поэтому, когда функция запускается, ссылка на нее внутри метода add() не будет иметь правильного значения this и она выиграет не работает должным образом.

Когда этот код let fn = x.add , он получает указатель на метод add , но нет привязки к объекту x . Это теряется. Затем, когда вы вызываете fn(5) , поскольку значение this в Javascript устанавливается в соответствии с тем, как вызывается функция, это просто обычный вызов функции, поэтому для this значения устанавливается значение undefined (в строгом режиме) или глобальный объект. (когда не в строгом режиме). В любом случае, это не нужный объект x . Чтобы сделать его объектом x , он должен быть вызван как x.fn() для this значения необходимо искусственно установить какой-то другой метод, например, с помощью .apply() , .call() или .bind() .

В приведенном выше случае, поскольку вы не контролируете вызывающую функцию (она вызывается другим кодом, который вы не контролируете), тогда .bind() является подходящим решением.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector