详解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 相关文章推荐
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
Jan 21 Javascript
jquery miniui 教程 表格控件 合并单元格应用
Nov 25 Javascript
浅析document.createDocumentFragment()与js效率
Jul 08 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
浅谈jquery回调函数callback的使用
Jan 30 Javascript
JavaScript实现数组在指定位置插入若干元素的方法
Apr 06 Javascript
SWFUpload多文件上传及文件个数限制的方法
May 31 Javascript
Vue键盘事件用法总结
Apr 18 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
Jul 12 Javascript
jQuery实现全选、反选和不选功能
Aug 16 jQuery
JavaScript数组特性与实践应用深入详解
Dec 30 Javascript
vue3实现v-model原理详解
Oct 09 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
我的论坛源代码(六)
2006/10/09 PHP
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
php str_pad 函数使用详解
2009/01/13 PHP
两个强悍的php 图像处理类1
2009/06/15 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
List Installed Hot Fixes
2007/06/12 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
禁止iframe脚本弹出的窗口覆盖了父窗口的方法
2014/09/06 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
Bootstrap入门书籍之(零)Bootstrap简介
2016/02/17 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
JS数组搜索之折半搜索实现方法分析
2017/03/27 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
原生JS实现图片懒加载(lazyload)实例
2017/06/13 Javascript
JavaScript学习笔记之图片库案例分析
2019/01/08 Javascript
详解关于微信setData回调函数中的坑
2019/02/18 Javascript
[15:41]教你分分钟做大人——灰烬之灵
2015/03/11 DOTA
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
从零学Python之hello world
2014/05/21 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
Python中一些不为人知的基础技巧总结
2018/05/19 Python
python 读取文本文件的行数据,文件.splitlines()的方法
2018/07/12 Python
详解flask表单提交的两种方式
2018/07/21 Python
使用EduBlock轻松学习Python编程
2018/10/08 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
python 读取数据库并绘图的实例
2019/12/03 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
2014教师党员自我评议总结
2014/09/19 职场文书
上班迟到检讨书范文300字
2014/11/02 职场文书
安全生产会议制度
2015/08/06 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
OpenCV项目实践之停车场车位实时检测
2022/04/11 Python