关于函数作为参数传递的笔记

在最近的项目中用到了websocket,遇到了一些问题,记下来。

案情重现

首先实例化一个连接(随便找的回声测试)

var ws = new WebSocket('ws://121.40.165.18:8800')

然后想当然的加上事件监听↓

ws.addEventListener('message', fun(event))

function fun(e) {
    console.log(e.data)
}

然后发现不起作用,而改用匿名函数就没啥问题。

ws.addEventListener('message', function (event) {
    console.log(event.data)
})

笔记

其实仔细想想就没发现了,第一次ws.addEventListener('message', fun(event))中传入的fun(event)不是一个函数,而是fun(event)的返回值undefind
正确的方法是

ws.addEventListener('message', fun)

举个例子

function main(f) {
    f('123')
}
function fun(str) {
    console.log(str)
    return 'qwe'
}
main(fun)//'123'
main(fun())// Uncaught TypeError: f is not a function

其中fun是作为一个变量传入的main函数,而如果传入fun(),则传入的实际是fun()的返回值'qwe'

正确的操作如下

var ws = new WebSocket('ws://121.40.165.18:8800')

ws.addEventListener('message', fun)

function fun(e) {
    console.log(e.data)
}

我可真是个小机灵鬼呢~

发表新评论