一个简单的函数绑定

在JavaScript与DOM交互中经常需要使用函数绑定,定义一个函数然后将其绑定到特定DOM元素或集合的某个事件触发程序上,绑定函数经常和回调函数及事件处理程序一起使用,以便把函数作为变量传递的同时保留代码执行环境。

<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').οnclick=handler.handlerFun;</script></body>

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

document.getElementById('btnTest').οnclick=function(){handler.handlerFun();}

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

自定义bind函数

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

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

小结

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

JavaScript函数绑定相关推荐

  1. 把多个JavaScript函数绑定到onload事件处理函数上

    为了让函数只在页面加载完毕后才得到执行,我们会把函数绑定到onload事件上: window.onload = userFunction 但如果有两个函数:firstFunction() 和 seco ...

  2. Web前端基础---JavaScript函数事件及其绑定DOM模型BOM模型

    Day03 JavaScript JavaScript是一种属于网络的高级脚本语言,被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用 户提供更流畅美观的浏览效果.通常JavaScri ...

  3. 【原创翻译】深入理解javascript事件处理函数绑定三部曲(一)——早期的事件处理函数...

    原文并非是是三部曲,而是一系列讲解javascript基础的文章.我是把其中三篇抽出来,作为一个整体,对理解事件绑定模型相当有帮助,原文在这里http://www.quirksmode.org/js/ ...

  4. javascript晚绑定_JavaScript的应用,调用和绑定通过托管野餐来解释

    javascript晚绑定 by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) JavaScript的应用,调用和绑定通过托管野餐来解释 (JavaScript's ...

  5. Javascript函数的简单学习

    第九课 函数的定义与调用 1:函数的定义     语法格式     function 函数名(数据类型 参数1){//function是定义函数的关键字         方法体;//statement ...

  6. javaScript系列 [01]-javaScript函数基础

    [01]-javaScript函数基础 1.1 函数的创建和结构 函数的定义:函数是JavaScript的基础模块单元,包含一组语句,用于代码复用.信息隐蔽和组合调用. 函数的创建:在javaScri ...

  7. javascript:函数的apply,call方法和length属性

    看js的资料,随手记下一些认为实用的东东,以飨和我一样正在学习的诸位看官.      "JavaScript 为函数对象定义了两个方法:apply 和call,它们的作用都是将函数绑定到另外 ...

  8. JavaScript函数的各种调用模式

    函数是JavaScript世界里的第一公民,换句话来说,就是我们如果可以精通JavaScript函数的使用,那么对JavaScript的运用可以更游刃有余了.熟悉JavaScript的人应该都知道,同 ...

  9. JavaScript事件绑定

    本文介绍一些JavaScript事件绑定的常用方法及其优缺点,同时在最后展示一个由 Dean Edwards 写的一个比较完美的事件绑定方案. 传统方式 element.onclick = funct ...

最新文章

  1. Windows搜索工具 — Everything
  2. 从 MySQL 执行原理告诉你:为什么分页场景下,请求速度非常慢?
  3. QIIME 2教程. 29参考数据库DataResources(2020.11)
  4. window之hosts
  5. 香帅的北大金融学课笔记19 -- 科技金融
  6. HttpURLConnection根据URL下载图片
  7. 李航书上隐马尔科夫模型案例的实验结果复现
  8. cmake 构建路径_新手必备:win10 系统下 VSCode+CMake+Clang+GCC 环境的搭建
  9. 记录一次线上事故:SparkStreaming 写入 Hive 延迟
  10. python Flask配置笔记
  11. 简析三星新专利,语音识别技术的新方法
  12. 基于python网上订餐系统哪家好_网上订餐系统python程序代码_(完整版)基于安卓的网上订餐系统毕业设计...
  13. Vmware安装显示Microsoft Runtime DLL 安装程序未能完成安装
  14. 常见的平均查找长度总结
  15. 现代计算机体系结构发明人,cpu的发明人是谁啊?
  16. nove6怎么升级鸿蒙系统,华为手机怎么升级鸿蒙,华为鸿蒙系统支持手机型号大全...
  17. 基于layui 的数据表格复杂表头导出到excel文件中
  18. screen 远程终端不中断
  19. 《管理学》计划及其制订-学习笔记
  20. android app代码审计,常规漏洞/缺陷整理(持续更新)

热门文章

  1. 设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70)进行一趟归并后的结果为
  2. windows下 , py运用了 进程池, 将py打包成exe,出现错误的 解决思路之一
  3. java写便签_如何编写一个便签程序(用Java语言编写)
  4. c++中的文件读写的操作
  5. 关于jffs2文件系统如何掉电保护
  6. TCP服务器/客户端实例(C/C )
  7. C++ 类模板二(类模版与友元函数)
  8. 字符串函数参数传入传出(去空格)
  9. 300. 最长上升子序列
  10. 信号 09 | 函数pause