JS中关于事件处理函数名后面是否带括号的问题


Posted in Javascript onNovember 16, 2016

今天总结一个关于事件处理程序的小细节。首先回顾一下事件处理的一些概念。

JS中的事件处理(事件绑定)就是让某种或某些事件触发某些活动。有两种常见的形式,分别是DOM Level 0 和DOM Level 2。这两种方式最大的区别就在于DOM 0级事件处理只能用于事件冒泡,而DOM 2级事件处理却可以通过设置第三个参数来分别支持事件冒泡和事件捕获。

DOM 0级事件处理一般是直接把一个函数分配给一个事件处理程序,既可以在元素中直接分配一个事件处理程序,如方式一所示;也可以在脚本中把函数分配给事件处理程序,如方式二所示。

<!--方式一-->
<div onclick="fun1();fun2('world!');"></div>
<!--方式二-->
<div id="a">点我</div>
<script>
var a=document.getElementById("a");
a.onclick=fun1; //方式二 
function fun1(){
alert("hello!");
}
function fun2(cc){
alert(cc);
}
</script>

这两种方式的区别在上述示例中也显示了,第一种方式可以同时绑定多个处理函数,但要注意必须是全局函数,否则会抛出Reference错误。第二种方式只能一次绑定一个处理函数,否则新的函数会覆盖旧的函数。

DOM 2级事件处理不会直接绑定处理函数,而是将函数添加为一个事件监听器如下,他也可以绑定多个处理函数,不会产生覆盖。但这种方式存在浏览器兼容的问题,IE下必须用attachEvent方法代替。

a.addEventListener("click",fun1,false); //事件冒泡
a.addEventListener("click",anotherFun,false); //不会覆盖上一事件,均被执行

简单回顾到这里,言归正传,不知道在回顾的过程中大家有没有注意到一个令人困惑的小细节,就是引用函数的时候,函数名称后面有的时候加括号,有的时候不加括号。这到底对程序的运行有怎样的影响呢?我经过查阅资料按照自己的理解小小的总结如下。

首先是加括号的,你可能经常在程序里面这样写“fun1();”,没错,函数名后边加括号表示立即执行该函数,如果函数内存在返回值则得到该值。这样用的多了,你可能就习惯在所有调用函数的地方这样写,比如之前说的事件处理函数。但是,如果你这样做了那就可能造成一些失控的状况。比如说,你明明只是想在点击某一元素的时候才执行函数,却发现这个函数在一开始就被执行了。你可以发现,上面举例时所用的DOM0方式二和DOM2级事件处理函数都没有在函数名后面加括号,原因就在于避免这种状况发生。如果你加了括号,这个函数fun1就会被立即触发执行。

那为什么DOM0方式一中却有括号呢?那是因为标签的事件属性里引号之间会被当做js语句直接执行,加了括号才能保证调用并执行函数。但是由于是用元素标签这种方式绑定的事件,执行的时机就被控制在了点击该标签时触发。

如果没有函数名又想立即执行呢?也就是立即执行匿名函数表达式,这种模式很常见,来观察一下它的屁股后面是不是也跟着个立即执行小括号呢?注意,这种IIFE形式中包裹着整个函数体的小括号会限制作用域。具体对IIFE感兴趣的童鞋可以去查阅相关资料,这里不作赘述。

(function(){
//do something...
})();

现在再来分析不加括号的,前面我们提到了不加括号可以避免失控。是因为只将函数名传递给事件,相当于将函数指针(也就是这个函数的入口地址)传给元素事件。这样做的好处就在于可以在需要的时候找到函数并执行。打个小比喻来说,你和你的朋友会面,加了小括号时你的朋友就立即出现在你面前,他才不管你当时是不是在忙,有种不请自来的不快感;而不加括号相当于你的朋友告诉了你他家在哪,当你需要他的时候就来找他,这可真是位贴心的朋友啦。所以,大多数事件绑定都仅仅只是传递给事件一个函数指针也就是函数名。

这时又有一个问题,之前说明的都是无参函数,如果是像代码示例中的fun2这种有参函数怎么办呢?难道只能用DOM0的方式一那种方法么?当然是否定的,尽量不要使用DOM0方式一那种形式,不符合结构与行为分离的原则。一般这种情况下就是使用匿名函数解决了,如下代码所示。如果大家有什么好的建议也可以留言分享一下~

//DOM Level 0
a.onclick=function(){
fun2("world!");
};
//DOM Level 2
a.addEventListener("click",function(){fun2("world!");},false);

以上就是我的总结,如有错误还要请大家多多指正,谢谢!感谢一起学习的小伙伴陈童鞋,正是因为他提的问题才让我注意到了这个经常被忽略的细节。

以上所述是小编给大家介绍的JS中关于事件处理函数名后面是否带括号的问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
学习YUI.Ext 第三天
Mar 10 Javascript
javascript 设置文本框中焦点的位置
Nov 20 Javascript
js focus不起作用的解决方法(主要是因为dom元素是否加载完成)
Nov 05 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
Aug 08 Javascript
jQuery实现自定义checkbox和radio样式
Jul 13 Javascript
JS简单限制textarea内输入字符数量的方法
Oct 14 Javascript
JavaScript面向对象编写购物车功能
Aug 19 Javascript
js基本算法:冒泡排序,二分查找的简单实例
Oct 08 Javascript
jQuery表格的维护和删除操作
Feb 03 Javascript
Angular指令之restict匹配模式的详解
Jul 27 Javascript
javascript实现文件拖拽事件
Mar 29 Javascript
浅谈Layui的eleTree树式选择器使用方法
Sep 25 Javascript
微信小程序 时间格式化(util.formatTime(new Date))详解
Nov 16 #Javascript
jQuery实现的购物车物品数量加减功能代码
Nov 16 #Javascript
使用JavaScript获取URL中的参数(两种方法)
Nov 16 #Javascript
微信小程序 保留小数(toFixed)详细介绍
Nov 16 #Javascript
微信小程序 获取相册照片实例详解
Nov 16 #Javascript
js canvas仿支付宝芝麻信用分仪表盘
Nov 16 #Javascript
Javascript使用SWFUpload进行多文件上传
Nov 16 #Javascript
You might like
Ext.data.PagingMemoryProxy分页一次性读取数据的实现代码
2010/04/07 PHP
浅析PHP 按位与或 (^ 、&amp;)
2013/06/21 PHP
浅谈json_encode用法
2015/03/05 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
$.format,jquery.format 使用说明
2011/07/13 Javascript
JS鼠标滑过图片时切换图片实现思路
2013/09/12 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
jQuery背景插件backstretch使用指南
2015/04/21 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
深入理解vue $refs的基本用法
2017/07/13 Javascript
基于Vue中点击组件外关闭组件的实现方法
2018/03/06 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
基于使用paramiko执行远程linux主机命令(详解)
2017/10/16 Python
Python_LDA实现方法详解
2017/10/25 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
基于python实现百度翻译功能
2019/05/09 Python
Python获取当前脚本文件夹(Script)的绝对路径方法代码
2019/08/27 Python
Keras 快速解决OOM超内存的问题
2020/06/11 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
css3实现垂直下拉动画菜单示例
2014/04/22 HTML / CSS
CSS3新增布局之: flex详解
2020/06/18 HTML / CSS
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
电子商务专业实习生自我鉴定
2013/09/24 职场文书
村居抓节水倡议书
2014/05/19 职场文书
小学生九一八纪念日83周年演讲稿500字
2014/09/17 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
详解Python类和对象内容
2021/06/22 Python