我目前正在使用 nodejs
尝试 coffeescript
和 websockets。
我创建了一个 SocketHandler 类来管理 websocket 客户端:
class SocketHandler
constructor: (@server) ->
@server.on "connection", @onClientConnect
onClientConnect: (socket) ->
console.log "client connected"
socket.on "close", @onClientDisconnect
onClientDisconnect: (code, message) ->
console.log "client disconnected"
ws = require "ws"
server = ws.Server { port: 8080 }
sockethandler = new SocketHandler server
当我运行脚本并且客户端连接时,我收到以下错误消息:
client connected
events.js:210
throw new TypeError('listener must be a function');
^
TypeError: listener must be a function
[...]
我不知道为什么会发生这种情况。在我看来,我将函数引用传递给 socket.on
作为第二个参数。
我尝试进一步调查并尝试输出 onClientDisconnect
以查看它的类型。
所以我改变了
onClientConnect: (socket) ->
console.log "client connected"
socket.on "close", @onClientDisconnect
至
onClientConnect: (socket) ->
console.log "client connected"
console.log @onClientDisconnect
socket.on "close", @onClientDisconnect
导致输出未定义
值。
现在我真的很困惑,我认为我错过了该语言如何工作的一些基本知识。
你们谁能帮帮我吗?
最佳答案
提醒:@onClientConnect
是 this.onClientConnect
的简写。 this
正是这里的问题。函数调用的上下文(this
在函数内部)是在 Javascript 调用时确定的。当您传递一个函数时,接收者“没有上下文”地接收它,并且当这样调用时,this
不会引用您正在思考/想要的this
期待。
长话短说:您需要将 this
绑定(bind)到您的函数,因此 @onClientDisconnect
中的 @
实际上引用您的类实例:
@server.on "connection", @onClientConnect.bind @
CoffeeScript 中的替代方案(使用上下文绑定(bind)的粗箭头回调):
@server.on "connection", => @onClientConnect()
另请参阅How to access the correct `this` context inside a callback?
关于javascript - 将函数引用传递给函数失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35417471/