首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript函数和表达式函数

Javascript函数和表达式函数
EN

Stack Overflow用户
提问于 2020-08-06 14:19:37
回答 1查看 78关注 0票数 2

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

代码语言:javascript
复制
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执行,它按预期工作。

然而,在写完它之后,我认为函数表达式是不需要的,所以我用以下代码更改了data line

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

它崩溃了,并显示了一条可怕的错误消息:

代码语言:javascript
复制
  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调用应该只传递一个参数。

为什么行为会有所不同?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 14:33:33

问题在于上下文。

流将把data函数绑定到流本身

代码语言:javascript
复制
stream.on('data', function (chunk) {
  console.log(this) // it is the `stream`
  shasum.update(chunk)
})

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

代码语言:javascript
复制
function update(data, encoding) {
  const state = this[kState];
  if (state[kFinalized])
    throw new ERR_CRYPTO_HASH_FINALIZED();

要使其正常工作,您必须编写以下语句:

代码语言:javascript
复制
stream.on('data', shasum.update.bind(shasum))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63277897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档