JS 事件处理函数的杂记
首先这是个非常傻X的错误
缘由:之前总是喜欢将事件处理函数写在html里面,偶尔会使用js来绑定一个临时生成的匿名回调函数,后来为了规范和代码的清晰,统一将事件处理函数放在了一个初始化事件的函数中,采用jQuery的.click()函数,具体写法大概就是jq("selector").click(someFunc())
然后就出了个当时比较蛋疼的错误: 绑定函数之后就被触发了,当时一直搞不懂咋回事儿,后来突然发现传给click函数事件处理函数的时候,后面多写了个括号,直接就调用了一次. …
总之,无论如何时刻谨记,传入回调函数的,是一个函数的引用,带上括号的话就变成把函数调用一遍,然后返回值传入回调函数了
有的同学就问了:
我还带参数呢, 我就是想这么写咋办?
1 | jq('.selector').click(myFunc('param')) |
好办, 我们之前不是说过匿名回调函数吗, 把你要带参数调用的函数包在一个匿名函数里面就好了:
1 | jq('.selector').click(()=> myFunc('param')) |
(以上为es6语法,箭头函数)
不过这么做其实有点暴力,js 对 function 类型还提供了一个 bind 函数:
The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called
所以我们现在的写法可以改成:
1 | jq('.selector').click(myFunc.bind(null, 'param', 'param2')) |
◉ End.
参考资料:
如博文有叙述不妥以及不准确的地方, 望各位看客不吝赐教, 感谢.