【问题标题】:node.js: Cannot read property 'defaultEncoding' of undefinednode.js:无法读取未定义的属性“defaultEncoding”
【发布时间】:2015-03-05 09:47:08
【问题描述】:

我想写一个可变的 write() 函数。

var write = function(s) {
    process.stdout.write(s);
}
write("Hello world!");

我想你可以把它写得更短:

var write = process.stdout.write;
write("Hello world!");

但是在这里我会收到这个错误:

TypeError: Cannot read property 'defaultEncoding' of undefined
    at Writable.write (_stream_writable.js:172:21)
    at Socket.write (net.js:613:40)
    at repl:1:2
    at REPLServer.self.eval (repl.js:110:21)
    at Interface.<anonymous> (repl.js:239:12)
    at Interface.EventEmitter.emit (events.js:95:17)
    at Interface._onLine (readline.js:202:10)
    at Interface._line (readline.js:531:8)
    at Interface._ttyWrite (readline.js:760:14)
    at ReadStream.onkeypress (readline.js:99:10)

为什么会这样?

【问题讨论】:

    标签: node.js process stdout


    【解决方案1】:

    这一切都与 javascript 处理 this 的方式有关。在函数process.stdout.writethere is a calldefaultEncoding() 内部使用this 变量。

    在 javascript 中,this 不会被赋值,直到对象调用定义了 this 的函数并且它与调用对象相关。

    所以在您的第一个示例中,this 指向 process.stdout 对象,它具有 defaultEncoding 方法。 在您的第二个示例中,thisundefined,因为该函数是从全局命名空间调用的。当process.stdout.write尝试调用defaultEncoding时,会抛出你提到的错误。

    您可以使用Function.prototype.call() 方法为函数手动定义this 值。示例:

    var write = process.stdout.write;
    write.call(process.stdout, "Hello world!");
    

    call 的第一个参数是函数内部用作this 的对象。

    我推荐阅读this article,它在javascript中解释了很多关于this的内容。

    【讨论】:

      【解决方案2】:

      使用.bind() 方法,它专为您的情况而设计。

      var write = process.stdout.write.bind(process.stdout);
      write("Hello world!");
      

      这会将process.stdout.write 方法中的this 变量设置为process.stdout

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 2021-12-05
        • 2020-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-01
        • 2021-11-24
        • 2020-04-17
        相关资源
        最近更新 更多