调用repl.start时自定义eval函数未正确赋值的原因
为何server.eval未被设置为simpleEval函数?
复现代码
const repl = require('repl') function simpleEval(cmd, context, filename, callback) { console.log('got eval') } function handleOutput(output) { console.log('got output ' + output) return '' } const server = repl.start({ eval: simpleEval, prompt: 'Enter Userid: >> ', terminal: true, ignoreUndefined: true, writer: handleOutput })
调试现象
创建server后暂停调试,可见server.writer为自定义的handleOutput函数,但server.eval并非传入的simpleEval。
原因解释
Node.js的REPL模块会对传入的自定义eval函数做内部封装:
- REPL会给
eval添加额外逻辑,比如处理命令的换行符、捕获执行错误、标准化异步回调流程等,最终server.eval指向的是经过这些封装后的内部函数,而非你直接传入的原函数。 - 而
writer函数则是直接赋值给实例属性,没有额外封装,所以调试时能看到它就是你定义的原函数。
不过你的simpleEval依然会正常工作,当REPL接收到用户输入时,内部封装后的函数会调用你定义的simpleEval执行逻辑。
内容的提问来源于stack exchange,提问作者Mark Lilback
相关产品推荐
相关产品推荐

