详解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 相关文章推荐
CLASS_CONFUSION JS混淆 全源码
Dec 12 Javascript
Javascript 生成指定范围数值随机数
Jan 09 Javascript
js实现类似新浪微博首页内容渐显效果的方法
Apr 10 Javascript
Jquery全选与反选点击执行一次的解决方案
Aug 14 Javascript
jquery使用on绑定a标签无效 只能用live解决
Jun 02 Javascript
AngularJS入门教程之Select(选择框)详解
Jul 27 Javascript
BootStrap入门教程(一)之可视化布局
Sep 19 Javascript
Vue.js实现图片的随意拖动方法
Mar 08 Javascript
JavaScript 跨域之POST实现方法
May 07 Javascript
vue实现微信二次分享以及自定义分享的示例
Mar 20 Javascript
layui操作列按钮个数和文字颜色的判断实例
Sep 11 Javascript
详解搭建一个vue-cli的移动端H5开发模板
Jan 17 Javascript
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
《PHP边学边教》(02.Apache+PHP环境配置――下篇)
2006/12/13 PHP
10条PHP编程习惯助你找工作
2008/09/29 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
thinkphp模板输出技巧汇总
2014/11/24 PHP
php中socket通信机制实例详解
2015/01/03 PHP
php类的扩展和继承用法实例
2015/06/20 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
JavaScript关于select的相关操作说明
2010/01/13 Javascript
jquery.cookie用法详细解析
2013/12/18 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
javascript创建函数的20种方式汇总
2015/06/23 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
2016/08/15 Javascript
前端弹出对话框 js实现ajax交互
2016/09/09 Javascript
JavaScript学习总结(一) ECMAScript、BOM、DOM(核心、浏览器对象模型与文档对象模型)
2018/01/07 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
node后端服务保活的实现
2019/11/10 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
Vue 根据条件判断van-tab的显示方式
2020/08/03 Javascript
Python pickle模块用法实例
2015/04/14 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
导出HTML5 Canvas图片并上传服务器功能
2019/08/16 HTML / CSS
使用iframe+postMessage实现页面跨域通信的示例代码
2020/01/14 HTML / CSS
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
优秀教师获奖感言
2014/01/31 职场文书
同事打架检讨书
2014/02/04 职场文书
销售团队获奖感言
2014/08/14 职场文书
党员群众路线教育实践活动学习笔记
2014/11/05 职场文书
学术会议邀请函
2015/01/30 职场文书
教师求职自荐信
2015/03/26 职场文书
初中语文教师研修日志
2015/11/13 职场文书
yolov5返回坐标的方法实例
2022/03/17 Python
全新239军机修复记
2022/04/05 无线电