我正在学习nodejs(我喜欢它!)。我试图找出如何为console.log
设置更短的别名,我发现我可以使用var cout=console.log
并从此使用cout('[string]')
。然后,当我想使用process.stdout.write
时,我也尝试使用var out=process.stdout.write
为它创建一个简短的别名。但是当我使用out('[string]')
时,我收到以下错误:
_stream_writable.js:220 var state = this._writableState; ^ TypeError:无法读取未定义的属性'_writableState'
在Writable.write(_stream_writable.js:220:19) 在Socket.write(net.js:670:40) 在对象。 (/home/shayan/Desktop/nodejs/server.js:12:1)
在Module._compile(module.js:571:32)
在Object.Module._extensions..js(module.js:580:10) 在Module.load(module.js:488:32) 在tryModuleLoad(module.js:447:12) 在Function.Module._load(module.js:439:3) 在Module.runMain(module.js:605:10) 在运行(bootstrap_node.js:423:7)
这里有什么问题?
如何为process.stdout.write
正确创建简短别名?
感谢
答案 0 :(得分:2)
你不应该做这种“短别名”。它非常混乱,阅读代码的人不会理解为什么使用随机函数名而不是console.log
。但是,如果您确实想要创建函数别名,请考虑使用function
:
function out(text) {
// ^ ^- argument accepted by the function
// |------ the function name
process.stdout.write(text)
// ^- pass the argument you accepted in your new function to the long function
}
我添加了一些解释,以防您不知道某个功能如何工作,您可以安全地删除它。
修改强> 它不起作用的原因在于Node.JS的源代码。您获得的堆栈跟踪指向this行:
Writable.prototype.write = function(chunk, encoding, cb) {
var state = this._writableState;
// ...
}
它尝试从_writableState
引用名为this
的变量。正如here所写:
在函数内部,
this
的值取决于函数的调用方式。
这意味着,this
在您调用process.stdout
时引用process.stdout.write
,但是当您从别名中调用它时,它是未定义的。因此,您会收到Cannot read property '_writableState' of undefined
异常(因为undefined
不包含该变量,这对write
函数执行非常重要。
答案 1 :(得分:1)
除了函数声明之外,您还可以使用 Function.prototype.bind
:
const out = process.stdout.write.bind(process.stdout);
out('foo');
bind
返回一个新函数,其上下文 (this
) 绑定到您传递的任何值。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind