文章目录

  • 一、bind方法的作用?
  • 二、bind方法实现

一、bind方法的作用?

bind() 方法创建一个新的函数,在bind()被调用时,这个新函数的this被指定为bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。 --MDN

简单说,bindcall/apply类似都也是改变this的指向。但是bind并不会立即执行函数,而是返回一个绑定了this的新函数,且新函数的this无法再次被修改。
举个例子吧:

let obj = {num:1,add : function (a,b) {return a+b+this.num;}
}
console.log(obj.add(1,2));//4
let plus = obj.add;
// 原因:this.num在当前作用域内不存在,this指向window
console.log(plus(1,2));//NaN
// 使用call/apply改变this的指向
console.log(plus.call(obj, 1,2)); //4
console.log(plus.apply(obj, [1, 2]));//4
//bind返回一个新函数
let res = plus.bind(obj,1,2);
console.log(res());//4

二、bind方法实现

先通过一个例子来看一下bind都做了什么

var obj = {name:"Smiley"};
var greeting = function(str, lang){this.value = 'greetingValue';console.log("Welcome "+this.name+" to "+str+" in "+lang);
};
var objGreeting = greeting.bind(obj, 'the world');
objGreeting('JS')
  1. bind改变了greeting当中this的指向,使得this指向了obj,因此,this.name的内容是Smiley。最后,bind会返回一个函数。
  2. 我们可以在调用bind的时候,就可以开始给greeting传递参数。上面的例子当中,我们把’the world’作为greeting的第一个参数。
  3. 我们在调用objGreeting这个函数的时候,再传入剩余的参数。上面的例子中,第二个参数是’JS’作为第二个参数lang。
  4. 这个是MDN中提到的:“bind()函数会创建一个新绑定函数(bound function,BF)。绑定函数也可以使用new运算符构造,提供的this值会被忽略,但前置参数仍会提供给模拟函数”。有点晦涩,这也是bind实现中最复杂的一步,使用new关键字这种情况我们一会儿再分析。

接下来我们实现bind:

Function.prototype._bind = function(oThis){if(typeof this !== 'function'){throw new TypeError('被绑定的对象需要是函数');}const self = this;// 将类数组对象转换成数组并截取const args = [].slice.call(arguments, 1);let func = function(){};let fBound = function(){ // instanceof用来检测某个实例对象的原型链上是否存在这个构造函数的prototype属性,this instanceof func === true时,//说明返回的fBound被当做new的构造函数调用,此时this=fBound(){},否则this=window, //如果是的话使用新创建的this代替硬绑定的thisreturn self.apply(this instanceof func ? this : oThis, args.concat([].slice.call(arguments)));}//维护原型关系if(this.prototype){func.prototype = this.prototype;}//使fBound.prototype是func的实例,返回的fBound若作为new的构造函数,新对象的__proto__就是func的实例fBound.prototype = new func();return fBound;}

bind()方法实现相关推荐

  1. JS中的call、apply、bind方法详解

    bind 是返回对应函数,便于稍后调用:apply .call 则是立即调用 . apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(co ...

  2. JavaScript内置一些方法的实现原理--new关键字,call/apply/bind方法--前戏

    new关键字,call/apply/bind方法都和this的绑定有关,在学习之前,首先要理解this. 一起来学习一下this吧 首先.this是一个对象. 对象很好理解,引用类型值,可以实现如th ...

  3. 手写bind_深入理解 JavaScript 之手写 call, apply, bind 方法

    这是老生常谈的手写了,今天想自己试着实现一下,做个笔记. call 方法 Function.prototype.myCall = function (context) { if (context == ...

  4. 理解js中的this指向以及call,apply,bind方法

    <script> function a(){var user = "追梦子";console.log(this.user); //undefinedconsole.lo ...

  5. Laravel Ioc容器singleton和bind方法的区别

    Laravel中使用Ioc容器的singleton方法和bind方法创建实例有什么区别呢?它们两个都是返回一个类的实例,不同的是singleton是单例模式,而bind是每次返回一个新的实例,看下面的 ...

  6. 总结apply和call方法的使用 bind方法 bind方法的使用 函数中的几个成员

    总结apply和call方法的使用 <!DOCTYPE html> <html lang="en"> <head><meta charse ...

  7. 面试官问:能否模拟实现JS的bind方法(高频考点)

    可以点击上方的话题JS基础系列,查看往期文章 写于2018年11月21日,发布在掘金阅读量1.3w+ 前言 这是面试官问系列的第二篇,旨在帮助读者提升JS基础知识,包含new.call.apply.t ...

  8. JS中的bind()方法

    Function.prototype.bind()方法 bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()第一个参数的值,例 ...

  9. jQuery 事件 - bind() 方法

    定义和用法 bind() 方法为被选元素添加一个或多个事件处理程序,并规定事件发生时运行的函数. 实例1(一个事件) 记得把js引用地址换掉 当点击鼠标时,隐藏或显示 p 元素: <html&g ...

  10. JavaScript的call,apply和bind方法之间的区别

    by Rajat Saxena 通过拉贾特·萨克森纳(Rajat Saxena) JavaScript的call,apply和bind方法之间的区别 (The difference between J ...

最新文章

  1. java ee 笔试题目,JSP经典笔试@题目(含答案)
  2. Java并发编程(五)JVM指令重排
  3. 如何使CPU占用率为50%
  4. 【Android Gradle 插件】ProductFlavor 配置 ( ProductFlavor#buildConfigField 方法 | 单独编译生成 BuildConfig 类的任务 )
  5. php echarts 两条曲线图,使用laravel和ECharts实现折线图效果的例子
  6. u-boot的mkconfig文件详解
  7. flink 3-转换
  8. win10 iis网站服务器,windows10如何搭建IIS服务器
  9. php this 和 self,PHP中this和self的区别
  10. 7个示例科普CPU Cache(转)
  11. 【报告分享】全球产业趋势系列研究之人工智能.pdf(附下载链接)
  12. C#牛人要具备的知识
  13. 软件类配置(七)【ubuntu16.04安装netbeans、opencv并配置开发环境。】
  14. 刷新页面后怎样让hover样式停留不消失
  15. Win7下 tts开发
  16. 1380Problem C:zyf的A+B问题
  17. Windows调试工具入门-3-WinDbg内核调试配置
  18. 卡内基梅隆大学计算机方向,留学美国卡内基梅隆大学计算机硕士研究方向
  19. 伽卡他卡学生端找不到计算机,伽卡他卡电子教室
  20. 重拾Java基础知识:网络编程

热门文章

  1. 怎么利用支付宝当面付实现手机网站支付
  2. 什么是ssr,seo
  3. 矿物质饲料补充剂的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  4. bootStrap输入框鼠标指针样式设定
  5. 模式识别技术漫谈(3)
  6. 【苹果CMS技术教程】苹果CMSV10伪静态基础认识和设置教程
  7. 嵌入式系统之实时系统调度算法
  8. 瓢城旅行社网页界面设计(HTML+CSS)
  9. Phonics 自然拼读法 ou ow oi oy au aw oo oo ea Teacher:Lamb
  10. 日常开发中常见英语单词(都总结好啦)