转自:https://segmentfault.com/q/1010000007337410?_ea=1313467

事件对象传递原理

1、前置知识回顾

在讲传递原理前,我们先看看普通函数是如何传递参数的:

    let num1=1,num2=2,num3=3;
function foo(){
console.log(arguments);
} function foo1(a,b,c){
console.log(a,b,c);
} foo(num1,num2,num3,num1,num2);
foo1(num1,num2);

可以从例子中看到,给函数传递参数,是在我们执行函数的时候才能进行的。在建立函数的时候,不管你设定形参也好,还是不设定形参,都不影响函数参数的传递。

关键在于谁能执行函数,谁就能给函数传递参数。

我们设定形参,形参就能接收对应位置的实参。不设定形参,在arguments里面也能找到。

2、事件对象参数的传递模拟

现在我们来模拟一个事件对象参数的传递过程:

定义一个事件对象myEvent:

    let myEvent={
type:"点击",
clientX:"x方向坐标",
clientY:"y方向坐标",
target:"事件源"
}

写一个事件函数:

function fn(){
console.log(arguments[0]);
} ele.onclick=fn;

假设我是点击事件,当触发我的时候,我就会执行fn函数:

fn(myEvent);

然后就会打印出参数。

执行fn不是开发人员去做的,所以开发人员不能传递实参给fn。只有事件自己可以传递实参给fn,那它现在想传的就是myEvent。

所以,对于开发人员而言,才说这个事件对象是自动传递进去的。

那为了方便,开发人员可以给fn函数设定形参,来接收这个自动传入的事件对象:

function fn(e){
console.log(e);
console.log(e.type);
}

触发事件,事件方法执行的时候,传入实参myEvent,这个实参自然会赋值给形参e,所以,e=myEvent。这样使用就方便了。

这就是事件对象传递原理

最新文章

  1. Microsoft Capicom 2.1 On 64bit OS
  2. C# 实现一个可取消的多线程操作 示例
  3. 使用ajax提交form表单,包括ajax文件上传
  4. DEDECMS之三 首页、列表页怎么调用文章内容
  5. RelativeLayout.LayoutParams.addRule()方法
  6. 基于Html5的移动端开发框架的研究
  7. 减少远程ssh的延迟
  8. 【bzoj3110】[Zjoi2013]K大数查询
  9. Java获取方法参数名、Spring SpEL解析
  10. 转:gpio_request
  11. 动态脚本,在js里面又写js
  12. poj 3177
  13. VS2008生成DLL并使用
  14. dedecms后台系统基本参数标题
  15. C++编程剖析 问题 方案 和设计准则
  16. Linux第三节课学习笔记
  17. PC装MAC(VM虚拟机)想体验苹果系统的福利
  18. Docker(一)基本概念
  19. Java开发环境配置(1)--tool准备
  20. switch语句以及三种循环语句的总结

热门文章

  1. (js)粘贴时去掉HTML格式
  2. 好用的jQuery分页插件
  3. 【bzoj3038】上帝造题的七分钟2
  4. 3D Computer Grapihcs Using OpenGL - 03 OpenGL Buffer Data
  5. VMware 15 安装 macOS 10.14优质教程链接集合
  6. HTML canvas中translate()与rotate()的理解
  7. java中的 sleep() 和 wait() 有什么区别?
  8. vue 实现,子组件向父组件 传递数据
  9. k8s上的基础概念和术语
  10. python分别使用多线程和多进程获取所有股票实时数据