Javascript функция и функция выражения - PullRequest
2 голосов
/ 06 августа 2020

Эта крошечная программа Javascript возвращает sha256 ha sh своего текста.

const shasum = require('crypto').createHash('sha256');
const stream = require('fs').createReadStream(__filename);

stream.on('error', function() { console.log('Error.'); });
stream.on('data', function (chunk) { shasum.update(chunk); }); /* <--- data line */
stream.on('end', function() {
    const sha = shasum.digest('base64');
    console.log(`The sha is ${sha}`);
});

Выполненная с Nodejs эрбием, она работает должным образом.

Однако после Написав его, я подумал, что выражение функции не нужно, и поэтому я изменил data line следующим:

stream.on('data', shasum.update);

И он вылетает с ужасным сообщением об ошибке c:

  if (state[kFinalized])
           ^

TypeError: Cannot read property 'Symbol(kFinalized)' of undefined
    at ReadStream.update (internal/crypto/hash.js:78:12)
    at ReadStream.emit (events.js:311:20)
    at addChunk (_stream_readable.js:294:12)
    at readableAddChunk (_stream_readable.js:275:11)
    at ReadStream.Readable.push (_stream_readable.js:209:10)
    at internal/fs/streams.js:210:12
    at FSReqCallback.wrapper [as oncomplete] (fs.js:487:5)

Javascript очень гибок с вызовами функций, но согласно документации вызов stream.on data должен передавать только один параметр.

Почему поведение отличается?

1 Ответ

1 голос
/ 06 августа 2020

Проблема заключается в контексте.

Поток привяжет функцию data к самому потоку

stream.on('data', function (chunk) {
  console.log(this) // it is the `stream`
  shasum.update(chunk)
})

В этом случае shasum.update привязан к потоку , поэтому функция обновления не будет работать:

function update(data, encoding) {
  const state = this[kState];
  if (state[kFinalized])
    throw new ERR_CRYPTO_HASH_FINALIZED();

Чтобы она работала, вы должны написать этот оператор:

stream.on('data', shasum.update.bind(shasum))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...