【问题标题】:nodejs: short alias for process.stdout.writenodejs:process.stdout.write 的短别名
【发布时间】:2017-09-07 19:15:40
【问题描述】:

我正在学习 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 的短别名? 谢谢

【问题讨论】:

  • 这是一个被低估的问题

标签: javascript node.js


【解决方案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

【讨论】:

  • 这是一个非常好的答案!所以“问题”是它是一种方法,当你试图不礼貌地抢夺它时,它看不到原始的父对象。 :D
【解决方案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;
    // ...
}

它尝试从this 引用一个名为_writableState 的变量。如写的here

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

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

【讨论】:

  • 好吧,我希望我能深入了解为什么我解释的方法适用于 console.log 而不适用于 process.stdout.write。此外,您建议一个函数这一事实是否意味着无法为 process.stdout.write 提供一个简短的别名?这很奇怪!但正如你所说,代码可读性强烈建议不要使用这些方法。我赞成你的回答,但因为我是新人,所以我的投票不可见!
  • @Credo 我更新了我的答案以提供更多细节。如果有不清楚的地方,请随时询问。
猜你喜欢
  • 2010-11-25
  • 2012-04-17
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
  • 2023-02-26
  • 2017-12-19
相关资源
最近更新 更多