nodejs:process.stdout.write的岸别名

时间:2017-04-12 06:46:10

标签: 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;   ^ 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正确创建简短别名? 感谢

2 个答案:

答案 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