JS中的bind()方法

JavaScript中call、apply、bind详解及手写实现 首先,我们都知道JavaScript中的this指向分为软绑定及硬绑定。并且this的指向与执行上下文有关系。在全局执行上下文中,this指向 全局对象(),在对象调用其内部方法时,this指向调用的地方,这就称为。那么如何使用呢?这就需要使用JavaScript中内置的方法来实现了。 阅读详情

Function.prototype.bind()方法

转自——JS中的bind()方法_kongjunchao159的博客-优快云博客_bind方法

bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()第一个参数的值,例如,f.bind(obj),实际上可以理解为obj.f(),这时,f函数体内的this自然指向的是obj

例子

 
  1. var a = {

  2.     b : function(){

  3.         var func = function(){

  4.             console.log(this.c);

  5.         }

  6.         func();

  7.     },

  8.     c : 'Hello!'

  9. }

  10. a.b();

  11. //undefined

  12. 注意:这里的this指向的是全局作用域,所以会返回undefined

  13. var a = {

  14.     b : function(){

  15.         var that = this;

  16.         var func = function(){

  17.             console.log(that.c);

  18.         }

  19.         func();

  20.     },

  21.     c : 'Hello!'

  22. }

  23. a.b();

  24. //Hello!

  25. 注意:可以通过赋值的方式将this赋值给that

  26. var a = {

  27.     b : function(){

  28.         var func = function(){

  29.             console.log(this.c);

  30.         }.bind(this);

  31.         func();

  32.     },

  33.     c : 'Hello!'

  34. }

  35. a.b();

  36. //Hello!

  37.  

  38. var a = {

  39.     b : function(){

  40.         var func = function(){

  41.             console.log(this.c);

  42.         }

  43.         func.bind(this)();

  44.     },

  45.     c : 'Hello!'

  46. }

  47. a.b();

  48. //Hello!

注意:当然,也可以通过bind的方式绑定this,上述两种bind绑定的方式都可以
再看另外一种用法

例子

 
  1. function f(y, z){

  2.     return this.x + y + z;

  3. }

  4. var m = f.bind({x : 1}, 2);

  5. console.log(m(3));

  6. //6

注意:这里bind方法会把它的第一个实参绑定给f函数体内的this,所以这里的this即指向{x : 1}对象,从第二个参数起,会依次传递给原始函数,这里的第二个参数2,即是f函数的y参数,最后调用m(3)的时候,这里的3便是最后一个参数z了,所以执行结果为1 + 2 + 3 = 6
分步处理参数的过程其实是一个典型的函数柯里化的过程(Curry)

我们再来看一道题目

 
  1. var a = document.write;

  2. a('hello');

  3. //Error

  4.  

  5. a.bind(document)('hello');

  6. //hello

  7.  

  8. a.call(document, 'hello');

  9. //hello


注意:这里直接调用a的话,this指向的是global或window对象,所以会报错,通过bind或者call的方式绑定this至document对象,即可正常调用
可以用bind的方式预定义参数,例子

 
  1. function list(){

  2.     return Array.prototype.slice.call(arguments);

  3. }

  4. var list1 = list(1, 2, 3);

  5. //[1, 2, 3]

  6.  

  7. //预定义参数

  8. var a = list.bind(undefined, 10);

  9.  

  10. var list2 = a();

  11. //[10]

  12.  

  13. var list3 = a(1, 2, 3);

  14. //[10, 1, 2, 3]


注意:这里的Array.prototype.slice.call(arguments)是用来将参数由类数组转换为真正的数组,a的第一个参数undefined表示this的指向,第二个参数10即表示list中真正的第一个参数,依次类推


如何自己实现bind方法?

因为bind()函数发布在ES5中,因此并不能很好的在所有浏览器中运行,需要Polyfill,当然现在几乎所有现代浏览器都支持ES5

 
  1. //my_bind方法支持绑定对象

  2. Function.prototype.my_bind = function(context){

  3.     var self = this;

  4.     return function(){

  5.         return self.apply(context, arguments);

  6.     }

  7. }

  8.  

  9. //测试

  10. function a(){

  11.     return this.name;

  12. }

  13. a();    //''

  14.  

  15. var b = {name : 'kong'};

  16. a.bind(b)();    //kong

  17.  

  18. a.my_bind(b)();        //kong


上述是最简单的一种实现方式,仅可用来绑定,不可传参
更加健壮的方式:

 
  1. //my_bind方法不仅可以绑定对象,还可以传参

  2. Function.prototype.my_bind = function(context){

  3.     var args = Array.prototype.slice.call(arguments, 1);

  4.     //args [7, 8]

  5.     var self = this;

  6.     return function(){

  7.         var innerArgs = Array.prototype.slice.call(arguments);

  8.         //innerArgs [9]

  9.         var finalArgs = args.concat(innerArgs);

  10.         //finalArgs [7, 8, 9]

  11.         return self.apply(context, finalArgs);

  12.     }

  13. }

  14.  

  15. //测试

  16. function a(m, n, o){

  17.     return this.name + ' ' + m + ' ' + n + ' ' + o;

  18. }

  19.  

  20. var b = {name : 'kong'};

  21.  

  22. a.my_bind(b, 7, 8)(9);        //kong 7 8 9


注意:这里my_bind函数中args表示的是在bind时传入的预定义参数,这里即为7和8,分别表示m和n,return中的innerArgs表示的是调用a的时候传入的参数,这里表示9,即o,最后用concat连接两个数组,即为finalArgs,所以最后执行的是a(7, 8, 9),this指向b,实现了一个完善点的bind方法

处理bind返回的函数如果作为构造函数,搭配new关键字出现的话,我们绑定的this就需要被忽略的兼容性问题

更加完美的方式

 
  1. //bind返回的函数如果作为构造函数,搭配new关键字出现的话,我们绑定的this就需要被忽略

  2. //处理构造函数场景下的兼容

  3. Function.prototype.bind = Function.prototype.bind || function(context){

  4.     //确保调用bind方法的一定要是一个函数

  5.     if(typeof this !== "function"){

  6.         throw new TypeError("Function.prototype.bind - what is trying to be bound is not callable");

  7.     }

  8.     var args = Array.prototype.slice.call(arguments, 1);

  9.     var self = this;

  10.     var F = function(){};

  11.     F.prototype = this.prototype;

  12.     var bound = function(){

  13.         var innerArgs = Array.prototype.slice.call(arguments);

  14.         var finalArgs = args.concat(innerArgs);

  15.         return self.apply(this instanceof F ? this : context || this, finalArgs);

  16.     }

  17.     bound.prototype = new F();

  18.     return bound;

  19. }

js bind 传参、_图解:一篇彻底带你搞懂 JS 中的 this 指向问题 写在前边Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象。其中this就是实现面向对象的一个非常重要的特性,但是 this在Javascript非常容易理解错,尤其是对于接触静态语言比较久的同学来说。而且 this又是面试中和实际项目中的重中之重,不得不单独拿出一篇文章来把它理解透透的。上面说到this参数是面向对象Javascr... 阅读详情

相关推荐

Win11下CH340串口识别失败的终极排查指南:从驱动更新到硬件电路检查

本文提供了Windows 11系统下CH340串口芯片识别失败的全面排查指南。从驱动更新、系统设置等软件层面入手,逐步深入到USB线缆、电源测量等硬件连接检查,并重点剖析了硬件设计细节,如电源退耦电容容值对设备描述符请求的关键影响,最终帮助开发者系统性地定位并解决识别难题。

weixin_29174013的博客 589

js中bind()使用详情

前言 最近在在搞React的时候有用到bind()的时候,因为他的用法其实我还一直不是特别的清楚,所以今天我把bind()他的用法和我遇到的结合起来这样来写一个博客,这样应该可以加深自己的印象同时可以来跟好的来解析bind的使用方法 1.那么我们先来介绍一下bind() Function.prototype.bind() bind()方法主要就是将函数绑定到某个对象,bind()会创......

qq_39148344的博客 4万+

六自由度机械臂运动学分析及其轨迹规划

六自由度机械臂轨迹规划 通过对比三次多项式插值法与五次多项式插值法的效果,选取后者对机械臂进行轨迹规划,将运动学解导入Matlab Robotics Toolbox仿真,得到各关节角度、速度和加速度与时间关系曲线。 三次多项式插值法 三次多项式有4个待定系数,可同时对起始点和目标点的角度和角速度给出约束条件。 数学公式 MATLAB代码 五次多项式插值法 五次多项式有6个待定系数,可同时对起始点和...

两条眉毛 6万+

JS中【bind】详解以及与【apply】和【call】的区别

bind方法是 JavaScript 中非常强大且常用的工具,它能够灵活地绑定函数的this值,并且可以预置参数来实现函数柯里化。在了解bind的工作原理和应用场景后,你可以更好地控制函数的执行上下文和参数传递,使代码更加灵活和可维护。

2301_79858914的博客 4004

FANUC机器人KAREL编程实战:手把手教你用SOCKET指令连接外部设备(附完整.KL文件)

本文详细解析了FANUC机器人KAREL编程中SOCKET指令的应用,从开发环境配置到工业级通讯全流程,涵盖网络参数设置、模块化代码设计、错误处理及现场调试技巧。通过实战案例,帮助开发者掌握与外部设备稳定连接的关键技术,提升工业自动化系统的通讯可靠性。

weixin_30907935的博客 225

TWINCAT3保姆级教程:手把手教你给Ecat从站烧录EEPROM(含XML配置避坑指南)

本文提供TWINCAT3环境下Ecat从站EEPROM烧录的完整教程,涵盖XML配置避坑指南。详细讲解环境准备、设备扫描、XML文件配置、EEPROM烧录流程及故障排查,帮助工程师高效解决设备识别问题,提升产线调试效率。

weixin_30693683的博客 516

js的bind方法

转载:http://www.jb51.net/article/94451.htm http://www.cnblogs.com/TiestoRay/p/3360378.html https://segmentfault.com/a/1190000002662251 对于函数绑定(Function binding)很有可能是大家在使用JavaScript时最少关注的一点,但是当你意识...

826

西门子S7-200 SMART PLC高速计数器与增量式编码器实战配置指南

在工业自动化控制系统中,传感器是将物理量转换为电信号的关键组件,其中编码器作为核心的位置与速度检测元件,其工作原理基于光电或磁电效应,将机械位移转换为脉冲序列。增量式编码器通过输出相位差90度的A/B两相脉冲,不仅能实现精确的位移测量,还能通过相位关系自动判别运动方向,并通过倍频技术提升分辨率。其技术价值在于为PLC等控制器提供了实时、高精度的位置反馈,是实现闭环控制、提升系统精度与可靠性的基础。在包装机械、物料输送、绕线设备等应用场景中,编码器与PLC高速计数器的协同工作是实现精确定位、定长切割与速度控制

weixin_29178069的博客 395

JS bind()方法、JS原生实现bind()

JS bind()方法、JS原生实现bind() puxiaotaoc关注 12018.09.09 00:50:08字数 134阅读 29,413 一、arguments的含义 // arguments 是一个对应于传递给函数的参数的类数组对象 function a(){ console.log(arguments); } a(); // Arguments [c...

thlzjfefe的博客 1105

SolidWorks软件二次开发:使用C#进行SolidWorks二次开发

SolidWorks 提供的 API(应用程序编程接口)允许开发者使用多种编程语言(如 C#、VB.NET 等)来控制和扩展 SolidWorks 的功能。API 架构基于 COM(组件对象模型),这意味着开发者可以通过引用 SolidWorks 的类型库来访问其对象模型。SolidWorks 的对象模型包括了从文档、零件、装配体到特征、草图等所有 SolidWorks 中可操作的对象。

kkchenjj的博客 3214

Unreal Engine Profiler:动画系统性能分析教程_2024-07-23_03-05-38.Tex

Unreal Engine Profiler 是一个内置的性能分析工具,它可以帮助开发者识别和解决游戏中的性能瓶颈。Profiler 提供了详细的性能数据,包括 CPU 使用率、GPU 负载、内存使用情况等,特别针对动画系统,可以查看动画蓝图的执行时间、骨骼动画的计算成本、以及动画混合和重定向的效率。通过这些数据,开发者可以定位到具体的问题,比如哪些动画状态消耗了过多的 CPU 时间,或者哪些动画资源导致了内存泄漏。

825

JavaScript中bind()的介绍及使用方法

JavaScript的bind()方法介绍及实例说明

yhyvc的博客 2174

NVIDIA Cosmos:生成式物理世界模型 从入门到精通1

Prompt Upsampler模型通过微调T5-XXL实现低质量描述到专业级描述的自动扩展,将"一个机器人在仓库"转换为"一台橙色的Kiva自主移动机器人在现代化电商仓库的过道中行驶,头顶的LED阵列投射出冷白色光线,地面反射出机器人的轮廓,摄像机以1.5米高度跟随拍摄,轻微晃动模拟手持效果"。控制输入(深度图、语义分割等)经独立的卷积编码器处理后注入控制分支,提取的多尺度特征通过零卷积层(zero convolution)逐步释放至主网络,避免初始训练阶段的噪声干扰。视频条件通过时序掩码控制扩散范围。

VectorShift的博客 136

Js中bind()方法

Function.prototype.bind()方法 bind()方法主要就是将函数绑定到某个对象,bind()会创建一个函数,函数体内的this对象的值会被绑定到传入bind()第一个参数的值,例如,f.bind(obj),实际上可以理解为obj.f(),这时,f函数体内的this自然指向的是obj 例子 var a = { b : function(){ var func = function(){ console.log(this.c);

qq_41555473的博客 737

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaScript进阶:JS中的call()、apply()和bind方法

call()、apply()和bind方法 1、call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象。 说明: call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供

cho_jun的博客 523

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JavaScript中call()、apply()和bind()方法的详细用法与区别

JavaScript中call()、apply()和bind()方法的详细用法与区别

2301_80270696的博客 1738

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

转:javascript方法--bind()

javascript方法--bind() bind方法,顾名思义,就是绑定的意思,到底是怎么绑定然后怎么用呢,下面就来说说我对这个方法的理解。 语法 fun.bind(this,arg1,arg2,...) bind()方法会创建一个新的函数,称为绑定函数,fun方法在this环境下调用 该方法可传入两个参数,第一个参数作为this作用域,可以理解为让fun函数在this作用域下运...

zhouzuoluo的博客 188

python中bind的用法_Javascript中bind()方法的使用与实现

在讨论bind()方法之前我们先来看一道题目:javascriptvar altwrite = document.write;altwrite("hello");//1.以上代码有什么问题//2.正确操作是怎样的//3.bind()方法怎么实现对于上面这道题目,答案并不是太难,主要考点就是this指向的问题,altwrite()函数改变this的指向global或window对象,导致执行时提示非...

weixin_39640157的博客 358

Javascript中函数的bind()方法

bind()方法主要作用是将函数绑定至某个对象。 下面例子是在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新的函数。(以函数调用的方式)调用新的函数将会把原始的函数f()当做o的方法来调用。传入新函数的任何实参都将传入原始函数。 function f(y){ //待绑定的函数 return this.x + y; } var o = {x : 2}; /...

Ultraman_and_monster的博客 720

JavaScript bind() 方法的实现

bind() 方法的特点 bind() 方法会创建一个新函数。 当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this, 可以把除了第一个参数以外的其他参数都传递给下层的函数(这种技术称为“部分应用”,是“柯里化”的一种)注① 如果 bind() 返回的函数 作为构造函数使用,bind 时指定的 this 值会失效,但传入的参数有效。 new 调用返回的实例能够继承 绑定...

Beijiyang 1622

JavaScript函数方法之bind()方法,Function.prototype.bind()

bind()方法创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。 实例 1.创建绑定函数 bind() 最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的 this 值。JavaScript新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,希望方法中的 this 是原来的对象(比如在回调中传入...

flym_的博客 415
上一篇: JS中this关键字详解
下一篇: JS箭头函数
firstcode666
博客等级 码龄5年 53粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值