nodejs:process.stdout.write 的短别名



我正在学习nodejs(我喜欢它!)。我试图弄清楚如何为console.log使用更短的别名,我发现从那时起我可以使用var cout=console.log并使用cout('[string]')。然后当我想使用process.stdout.write时,我也尝试使用它创建一个简短的别名,使用var out=process.stdout.write.但是当我使用out('[string]')时,我收到以下错误:

_stream_writable.js:220 var 状态 = this._writableState;                   ^ 类型错误:无法读取未定义的属性"_writableState">

在 Writable.write (_stream_writable.js:220:19)     at Socket.write (net.js:670:40)     在对象。(/home/shayan/Desktop/nodejs/server.js:12:1)

在Module._compile(模块.js:571:32)

在Object.Module._extensions..JS(模块.js:580:10)     at Module.load (module.js:488:32)     at tryModuleLoad (module.js:447:12)     在Function.Module._load(模块.js:439:3)     at Module.runMain (module.js:605:10)     运行时 (bootstrap_node.js:423:7)

这是怎么回事? 如何正确创建process.stdout.write的短别名? 谢谢

你不应该做这种"短别名"。它非常混乱,阅读您的代码的人不会理解为什么您使用随机函数名称而不是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的源代码中。您返回的堆栈跟踪指向以下行:

Writable.prototype.write = function(chunk, encoding, cb) {
var state = this._writableState;
// ...
}

它尝试从this引用一个名为_writableState的变量。正如这里所写:

在函数内部,this的值取决于函数的调用方式。

这意味着,当您调用process.stdout.write时,this指的是process.stdout,但是当您从别名调用它时,它是未定义的。因此,你会得到一个Cannot read property '_writableState' of undefined异常(因为undefined不包含该变量,这对于执行write函数很重要)。

除了函数声明之外,您还可以使用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

最新更新