手动实现bind函数

  • bind函数语法
  • 函数内的this指向
  • 原理分析
    • 1.bind函数是函数调用的,而js中函数可以视作对象,当bind作为对象方法时,函数内部this指向该对象本身,那么此时调用this就是调用这个函数对象
    • 2.对象方法的this指向该对象本身,所以在bind函数内部的this指向的函数,作为bind函数参数的对象方法即可
    • 3.通过原型链,将bind函数作为Function构造函数的对象函数,因为所有函数都继承自Function函数所以所有函数都可以调用bind函数,而不需要手动赋值
  • 缺陷(若有解决方案请在评论区传授一下)

bind函数语法

bind() 方法会创建一个新函数,当这个新函数被调用时,它的 this 值是传递给 bind() 的第一个参数, 它的参数是 bind() 的其他参数和其原本的参数。

语法:

fun.bind(thisArg[, arg1[, arg2[, ...]]])

thisArg 当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用 new 操作符调用绑定函数时,该参数无效。

arg1, arg2, … (可选)当绑定函数被调用时,这些参数加上绑定函数本身的参数会按照顺序作为原函数运行时的参数。

例如:

function fn(a, b, c) {console.log(this);
}var _fn = fn.bind({a:123});
fn(); // 输出:window
_fn(); // 输出:{a:123}

函数内的this指向

原理分析

1.bind函数是函数调用的,而js中函数可以视作对象,当bind作为对象方法时,函数内部this指向该对象本身,那么此时调用this就是调用这个函数对象

例如:

function fun() {console.log("fun被调用");
}
function bind(obj) {console.log("bind中的this:", this);if (typeof this === "function") {this();}
}
bind(); // 输出:bind中的this: window
fun.bind = bind;
fun.bind(); // 输出:1.bind中的this: fun 2.fun被调用

2.对象方法的this指向该对象本身,所以在bind函数内部的this指向的函数,作为bind函数参数的对象方法即可

例如:

function bind(obj) {if (typeof this === "function") {obj.bindThis = this;return () => {obj.bindThis();};}
}
function testThis(obj) {console.log("this:", this);
}
var a = { a: 123 };
testThis.bind = bind;
var fn = testThis.bind(a);
fn();// 输出:this: {a: 123}
testThis(); // 输出:this: Window

3.通过原型链,将bind函数作为Function构造函数的对象函数,因为所有函数都继承自Function函数所以所有函数都可以调用bind函数,而不需要手动赋值

原型链的概念看这里

function bind(obj) {console.log("this:", this);if (typeof this === "function") {obj.bindThis = this;return () => {obj.bindThis();};}}function testThis(obj) {console.log("this:", this);}// bind();var a = { a: 123 }// testThis.bind = bind;Function.prototype.bind = bind;var b = testThis.bind(a); b(); // 输出:this: {a: 123}

缺陷(若有解决方案请在评论区传授一下)

1.原生的bind函数返回的函数不会改变内容,只是改变其this指向

原生:

本次实现:

【JavaScript】bind函数是怎么实现的 手动实现bind函数相关推荐

  1. 手动实现bind函数(附MDN提供的Polyfill方案解析)

    update: 2018-06-08 原文链接 为什么要自己去实现一个bind函数? bind()函数在 ECMA-262 第五版才被加入:它可能无法在所有浏览器上运行. 所以,为了理想主义和世界和平 ...

  2. ES6/03/函数的定义方式和调用方式,函数内的this指向,改变函数中this指向的三个方法(call(),apply(),bind())

    函数的定义方式 1,自定义函数(命名函数) function fun(){}; 2,函数表达式(匿名函数) var fun =function(){}; 3,利用new Function( '参数1' ...

  3. 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 4 章:组合函数...

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  4. apply、call、bind三者的区别—附:防抖、节流函数

    apply.call.bind三者的区别 相同点 1.1 三者都能改变函数中的this指向 1.2 第一个参数都是是要改变的this指向的对象 不同点 2.1.第二个参数:apply传的是参数数组:c ...

  5. 前端设计模式学习笔记(面向对象JavaScript, this、call和apply, 闭包和高阶函数)...

    JavaScript通过原型委托的方式来实现对象与对象之间的继承. 编程语言可分为两大类:一类是静态类型语言,另一类是动态类型语言 JavaScript是一门动态类型语言 鸭子类型的概念(如果它走起来 ...

  6. C++对象模型3——vptr的位置、手动调用虚函数、从汇编代码看普通调用和多态调用

    一.vptr的位置 class test { public:int i; virtual void testfunc() {} };int main() {test a;char* p1 = rein ...

  7. JavaScript对象this指向(普通键this指向 非指向函数的键)

    1.结论 JavaScript对象普通键(非指向函数的键)this指向是window. 2.示例 <!DOCTYPE html> <html lang="zh"& ...

  8. 函数的方法call、apply、bind

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. JavaScript从入门到精通之入门篇(二)函数和数组

    入门篇大纲 第二部分 函数与数组 1.函数 函数的定义 普通函数 function 函数名 (表达式1-) { 代码块 } js是解释性语言,在当前script标签代码执行的开始阶段,就会将普通函数放 ...

最新文章

  1. Objective-C代码的文件扩展名
  2. java plus方法_Java中MyBatis Plus知识点总结
  3. 2018-2019 20165203 《信息安全系统设计基础》第一周学习总结
  4. 修改服务器时间报错,修改服务器时间linux
  5. PyQt5笔记(01) -- 创建空白窗体
  6. Linux下Qt使用QAudio相关类进行音频采集,使用Windows下的Matlab软件播放
  7. jsp+aJax 登陆成功
  8. 写给初学者,一文搞懂大数据学习、岗位、面试及简历
  9. 环丙沙星大鼠血清白蛋白纳米粒|甲硝唑小麦麦清白蛋白纳米粒|雷替曲塞乳清白蛋白纳米粒(科研级)
  10. bootloader系列二——arm920t--bootloader架构设计
  11. 面试题-取出url中的参数以json对象结构输出(JavaScript)
  12. 论文解读:Detach and Adapt: Learning Cross-Domain Disentangled Deep Representation
  13. pvr.ccz 与 png 格式 互转的解决方案
  14. 三分钟搭建开源的工单系统ferry
  15. R语言while循环计算圆周率
  16. 移动互联网时代必读十大图书
  17. 数字孪生相关概念阐述
  18. vue项目,报错This is probably not a problem with npm,there is likely additional logging output above
  19. linux下载百度命令行,Linux 命令行使用百度网盘上传下载文件
  20. 为达成与英文品牌的统一 蘑菇街更换域名为mogu.com

热门文章

  1. PHP怎么实现页面重定向?
  2. 计算机一级备考一个月够吗,四级准备一个月能过吗 一般准备多长时间
  3. 音乐播放器的实现(五)—— 音量的加减和静音
  4. 电脑给手机传音乐,手机上找不到文件解决办法。
  5. VR直播丨颠覆性技术革命,新型直播已经到来
  6. 超详细的PHP入门知识点讲解
  7. 一款打击感超强的动作游戏《流星蝴蝶剑》
  8. NYOJ-79拦截导弹---LIS变形-最长递减子序列
  9. Shell编程 ——until循环
  10. PHP匿名函数 闭包 Use用法