在模板中,我们可以进行两种形式的事件绑定:
直接绑定一个函数:
<template>
<div @click="clickHandler"></div>
</template>
绑定
**javascript**
语句:<template>
<div @click="clickHandler()"></div>
</template>
其实,这两种绑定事件的方式编译后形成的模板是不一样的:
第一种方式是直接将指定的函数作为事件处理程序:on: {
click: vm.clickHandler
}
所以在这种情况下,
**clickHandler**
收到的第一个参数实际上是浏览器事件对象。
第二种方式,事件处理程序其实是Vue
自身创建的。并且有一个形式参数:$event
.on: {
click: function($event) {
vm.clickHandler();
}
那么,在
clickHandler
处理程序中,我们能不能使用$event
变量呢?显然是不能的。
在这里,我暴露出了一个严重的问题,那就是我之前将函数执行栈和函数的作用域链混为一谈了。
函数执行栈确实是**点击事件处理程序**
=>**clickHanlder**
。但是**clickHanlder**
的作用域链并不是这样,它是在这个函数生成的位置生成的。后续我会整理专门分析。作为一个两年工作经验的前端,我居然没有理清这个问题,实在是很不应该。