代码之家  ›  专栏  ›  技术社区  ›  Paolo.Bolzoni

Javascript函数和表达式函数

  •  1
  • Paolo.Bolzoni  · 技术社区  · 6 年前

    这个小小的Javascript程序返回其文本的sha256散列。

    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}`);
    });
    

    但是,在编写它之后,我认为不需要函数表达式,因此我更改了 data line 包括以下内容:

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

    它崩溃时会出现可怕的错误信息:

      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对于函数调用非常灵活,但是 according to the documentation 这个 stream.on data

    1 回复  |  直到 6 年前
        1
  •  0
  •   Manuel Spigolon    6 年前

    问题是背景。

    流将绑定 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))