详解JavaScript函数绑定


Posted in Javascript onAugust 18, 2013
<body>    <input id="btnTest" type="button" value="Button"/>
        <script type="text/javascript">            
            var handler={
                message:"Event handled.",
                handlerFun:function(){
                    alert(this.message);
                }
            };
            document.getElementById('btnTest').onclick=handler.handlerFun;
        </script>
    </body>

上面的例子创建了一个handler对象,handler.handlerFun()方法被分配为DOM按钮的click事件处理程序。设计意图是这样的:当点击按钮的时候触发该方法,弹出对话框显示handler定义的message,然而点击后对话框内容却是undefined。熟悉闭包的同学可以轻松看出来这个问题在于没有保存handler.handlerFun()方法的执行环境,this对象最后指向了DOM按钮而非handler。可以使用闭包解决此问题,修改函数绑定语句
document.getElementById('btnTest').onclick=function(){
                handler.handlerFun();
            }

这样就可以得到预期的结果,这个解决方案在onclick程序内部使用一个闭包直接调用handler.handlerFun()方法,当然这是特定于此场景的解决方案,创建多个闭包可能会令代码难以理解和调试。

自定义bind函数

function bind(fn,context){
                return function(){
                    return fn.apply(context,arguments);
                };
            }            document.getElementById('btnTest').onclick=bind(handler.handlerFun,handler);

通过自定义的bind函数可以将函数绑定到指定环境,bind()函数接收两个参数:一个绑定函数,一个执行环境,并返回一个在执行环境中调用绑定函数的函数。看起来很简单,但是其功能很强大,在bing()中创建了一个闭包,闭包使用apply()调用传入的函数,并给apply()传入执行环境和参数,这里的arguments是内部匿名函数的,而非bind()的。当调用返回的函数时,它会在给定的函数中执行被传入的函数,并给出所有参数。上面例子的调用handler.handlerFun依旧可以得到参数event,因为所有参数在都通过绑定的函数传递给它了。

小结

一旦要将某个函数以函数指针的形式传递,同时该函数必须在特定的环境中执行,自定义的bind()函数就可以使用,他们主要用于事件处理程序及setTimeout和setInterval,然而这种绑定方式和普通函数相比需要更多的内存开销,所以尽量只在必要的时候使用。

Javascript 相关文章推荐
javascript 设置文本框中焦点的位置
Nov 20 Javascript
如何让easyui gridview 宽度自适应窗口改变及fitColumns应用
Jan 25 Javascript
js 有框架页面跳转(target)三种情况下的应用
Apr 09 Javascript
JQuery实现鼠标移动到图片上显示边框效果
Jan 09 Javascript
node.js中的fs.futimes方法使用说明
Dec 17 Javascript
jquery实现的横向二级导航效果代码
Aug 26 Javascript
最全的Javascript编码规范(推荐)
Jun 22 Javascript
JS控件bootstrap suggest plugin使用方法详解
Mar 25 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
Jan 18 Javascript
基于JavaScript实现贪吃蛇游戏
Mar 16 Javascript
JavaScript 监听组合按键思路及代码实现
Jul 28 Javascript
vue实现input输入模糊查询的三种方式
Aug 14 Vue.js
jQuery 绑定事件到动态创建的元素上的方法实例
Aug 18 #Javascript
jQuery焦点图切换特效插件封装实例
Aug 18 #Javascript
JavaScript生成GUID的多种算法小结
Aug 18 #Javascript
实测jquery data()如何存值
Aug 18 #Javascript
js兼容的placeholder属性详解
Aug 18 #Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
Aug 18 #Javascript
jquery验证表单中的单选与多选实例
Aug 18 #Javascript
You might like
5.PHP的其他功能
2006/10/09 PHP
用PHP连接Oracle for NT 远程数据库
2006/10/09 PHP
解析VS2010利用VS.PHP插件调试PHP的方法
2013/07/19 PHP
PHP实现微信小程序人脸识别刷脸登录功能
2018/05/24 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
javascript 拖放效果实现代码
2010/01/22 Javascript
获取dom元素那些讨厌的位置封装代码
2010/06/23 Javascript
jquery动画2.元素坐标动画效果(创建一个图片走廊)
2012/08/24 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
2013/01/15 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
jquery validate.js表单验证入门实例(附源码)
2015/11/10 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
深入理解Node.js的HTTP模块
2016/10/12 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
layui 阻止图片上传的实例(before方法)
2019/09/26 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
Python input函数使用实例解析
2019/11/22 Python
Python命令行click参数用法解析
2019/12/19 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
TensorFlow保存TensorBoard图像操作
2020/06/23 Python
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
白俄罗斯大卖场:21vek.by
2019/07/25 全球购物
澳大利亚领先的亚麻品牌:Bed Threads
2019/12/16 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
人力资源管理专业毕业生自我评价
2013/09/21 职场文书
大学生创业计划书的范文
2014/01/07 职场文书
新学期班主任寄语
2014/01/18 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
高中同学会致辞
2015/08/01 职场文书
汶川大地震感悟
2015/08/10 职场文书
温馨祝福晨语:美丽的一天从我的问候开始
2019/11/28 职场文书
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技