【发布时间】:2018-12-31 12:37:18
【问题描述】:
仅供参考,我正在尝试遵循Abstract Encoding 规范。本质上,我想创建一个“函数变量”let foo = codec.encode,其中encode() 调用codec 中的另一个函数,我可以访问foo.bytes。看来我可以访问bytes 的值但不能访问内部函数this.encodingLength(),或者创建一个绑定函数变量并发生完全相反的情况。仅当我将函数 encode() 分配给变量时才会出现此问题。我在某处读到bind() 创建了一个包装函数(无法访问bytes,并且如果没有正确的上下文,对象函数也无法访问其他对象函数。是否有可能两个世界?
示例代码:
const codec = {
encode: function encode () {
encode.bytes = 2
this.encodingLength()
},
encodingLength: function encodingLength () { }
}
let foo = codec.encode
let bar = codec.encode.bind(codec)
> foo()
TypeError: this.encodingLength is not a function
at encode (repl:4:6)
> foo.bytes
2
> bar()
undefined
> bar.bytes
undefined
也使用this.encode.bytes 似乎没什么区别
const codec = {
encode () {
this.encode.bytes = 2
this.encodingLength()
},
encodingLength () { }
}
【问题讨论】:
-
您是否希望
bytes对于encode的每次调用都(可能)不同? -
是的(应该是),尽管出于演示目的,我只是将其分配给
2 -
仅供参考,为调用返回值指定一个全局变量是一件可怕的事情。
-
您能详细说明一下吗?
-
您链接的“抽象编码”规范说“编码后
encoding.encode.bytes应设置为用于编码对象的字节数。”。encoding.encode.bytes本质上是一个全局变量,除非他们假设每个编码都被实例化为具有非共享方法的一次性对象。并且使用全局变量来传递返回值是一个可怕的想法 - 这也会导致您的问题。
标签: javascript node.js javascript-objects ecmascript-5