曾经在看别人的代码和学习一些教学视频的时候,发现从不同的地方看到的代码,实现的逻辑是一样的,但是对事件的写法却各不一样,比如下面是两个人写的代码,实现的逻辑省略了,但是一样的。
从上面的代码中,我们看见两个人都是获取同一个dom节点,然后在上面作点击逻辑操作,但是为什么一个人写的是event,而另外一个人写的却是e呢,难道可以随便写吗?我一直对此百思不得其解,于是我采取了死记硬背的老方法把它记作准则来用,可是随着后面对js了解的加深,才得知其中深意。
要搞明白这里为什么事件的名字可以随便写的问题,首先得先了解js的函数的参数机制!js的参数可以随便写的,并且可以不限制个数,所以你可以写n个参数,但是在函数体中可能只用到几个参数,或者根本没有用参数也是没有问题的,像下面的代码,这是为什么呢!
实际上,js在运算的过程中,并不是从你定义的参数中去调用参数,而是从它的arguments去取参数,这个arguments类似于数组,可以通过取下标的方法取得对应的参数,比如arguments[0]可以取得arg1,arguments[1]可以取得arg2等,以此类推。比如下面的两个函数实现的最终结果是一样的!
那么这个arguments和你显示定义的参数是什么关系呢!其实他们是一种对应关系,通过对arguments取对应的下标可以得到对应的参数,下标是从0开始的,比如下面的代码!
基于此种关系,js的函数的参数定义可以很灵活,无论你定义了多少个参数,你都可以从arguments中取到。那么回到事件那里的代码,为什么写event或者e,甚至其它任意字符都可以呢!其实,在有事件发生时,等号右边的匿名函数的默认含有一个参数并且是一个事件对象,也就是arguments[0]为Event的一个实例,我们可以用下面的代码看它返回的是什么,就清楚了!
所以到这里,我们可以知道事件名字在这里可以随便写了,因为无论你写什么,它都对应的是arguments[0],因为你对应的第一个参数对应arguments[0]。如下代码(注:在ie8中ie8之前这里存在问题,arguments[0]并不是事件对象的实例,并且并没有含有默认参数!可以测试代码document.body.onclick = function(){ console.log(arguments); }便知道。)
但是你像下面这样写就有问题了;
上面的变量e并不是存在右边匿名函数中,所以它并不对应于arguments[0],如果非要采用这种方式的话,可以使用event,因为这是个关键字,默认在匿名函数中指代事件对象实例!
事件的兼容主要是ie浏览器和其它浏览器的兼容问题,ie的事件对象是挂在window的属性上的,并且早期当事件发生时,并不存在第一个参数是事件对象的实例!所以为了获得事件对象,需要像下面这样写: