繁体   English   中英

Javascript function 和表达式 function

[英]Javascript function and expression function

这个微小的 Javascript 程序返回其文本的 sha256 hash。

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 Erbium 执行,它按预期工作。

但是,写完后我认为不需要 function 表达式,所以我将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 对 function 调用非常灵活,但根据文档stream.on data调用应该只传递一个参数。

为什么行为不同?

问题是上下文。

stream 会将data function 绑定到 stream 本身

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

在这种情况下, shasum.update绑定到 stream,因此更新 function 将不起作用:

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

要让它工作,您必须编写以下语句:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM