nodejs:process.stdout.write 的短别名

mas*_*ion 7 javascript node.js

我正在学习 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; ^ 类型错误:无法读取未定义的属性“_writableState”

    在 Writable.write (_stream_writable.js:220:19) 在 Socket.write (net.js:670:40) 在 Object。(/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?谢谢

Ben*_*nni 6

你不应该做这种“短别名”。它非常混乱,阅读您代码的人不会理解为什么您使用随机函数名称而不是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
}
Run Code Online (Sandbox Code Playgroud)

我添加了一些解释,以防您不知道函数的工作原理,您可以安全地删除它。

编辑: 它不工作的原因是在 Node.JS 的源代码中。您返回的堆栈跟踪指向行:

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

它尝试引用一个名为_writableStatefrom的变量this。由于写在这里

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

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

  • @Credo 我更新了我的答案以提供更多细节。如果有不清楚的地方,请随时询问。 (2认同)

ant*_*ood 6

除了函数声明之外,您还可以使用Function.prototype.bind

const out = process.stdout.write.bind(process.stdout);
out('foo');
Run Code Online (Sandbox Code Playgroud)

bind返回一个新函数,其上下文 ( this) 绑定到您传递的任何值。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind

  • 这真是一个很好的答案!所以“问题”是它是一个方法,当你试图不礼貌地抢夺它时,它看不到原始的父对象。:D (3认同)