javascript函数的call、apply和bind的原理及作用详解

 更新时间:2023年05月22日 09:45:37   作者:咖啡教室  
javascript函数的call、apply和bind 本质是用来实现继承的,专业点说法就是改变函数体内部this的指向,当一个对象没有某个功能时,就可以用这3个来从有相关功能的对象里借用过来,文中通过代码示例介绍的非常详细,需要的朋友可以参考下

最早javascript实现继承是通过 prototype 原型链,后来有了 class 类,可以像其他面向对象语言一样来实现类的继承。

通俗点说就好像我们小时候,家里要将稻子加工成大米,但是家里又没有打米机,那就只能背到村里别人开的打米房里,叫别人打开他的打米机,将我们的稻子喂进去,然后就能接出来大米了。

call

call 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数:

function.call(thisArg, arg1, arg2, ...)

当第一个参数为 null 或 undefined 时,可以使用数组展开语法实现类似的结果。请注意,this 可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。

apply

apply 方法调用一个具有给定 this 值的函数,以及以一个数组(或一个类数组对象)的形式提供的参数:

function.apply(thisArg, [arg1, arg2])

call 和 apply 其实是同一个东西,区别只有参数不同,call 是 apply 的语法糖,call 方法接受的是一个参数列表,而 apply 方法接受的是一个包含多个参数的数组

bind

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

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

三者第一个参数都是 this 要指向的对象,如果如果没有这个参数或参数为 undefined 或 null,则默认指向全局 window。

实际应用场景

应用场景一:从数组中找出最大值、最小值

原生的 Math.max、Math.min 只能传入用逗号分隔的参数列表,但实际业务中我们往往拿到的是数组,就可以用下面的方法来实现(也可以用扩展运算符 ... 实现):

let arr = [1, 2, 3]
Math.min.apply(null, arr) // 这里第一个null表示不需要绑定this, 但是也不能省略,不能直接将arr给Math, 因为min必须接受两个及以上参数

应用场景二:伪数组转化成真数组

一般用于dom节点列表、具有 length 和序号属性的伪数组对象、函数参数 arguments

Array.prototype.slice.apply(fakeArray) // slice 省略参数时就是截取出所有元素,此处相当于 Array.prototype.slice.apply(fakeArray, 0, fakeArray.length)

到此这篇关于javascript函数的call、apply和bind的原理及作用详解的文章就介绍到这了,更多相关javascript函数的call、apply和bind内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript实现数字格式化的示例详解

    JavaScript实现数字格式化的示例详解

    在处理数字时,为了提高可读性,我们通常会将整数部分的数字以千分位或百分位分隔,本文将详细介绍如何使用JavaScript来实现数字的千分位和百分位分隔,需要的可以参考下
    2024-04-04
  • 基于JavaScript实现Json数据根据某个字段进行排序

    基于JavaScript实现Json数据根据某个字段进行排序

    这篇文章主要介绍了基于JavaScript实现Json数据根据某个字段进行排序的相关资料,需要的朋友可以参考下
    2015-11-11
  • Javascript 页面模板化很多人没有使用过的方法

    Javascript 页面模板化很多人没有使用过的方法

    今天遇到一个问题,这个问题也是我以前遇到的问题,以前的方式,也是大多数人使用的方式。大家可以看看我的文章
    2012-06-06
  • window.open关于浏览器拦截问题分析及解决方法

    window.open关于浏览器拦截问题分析及解决方法

    window.open是javascript函数,该函数的作用是打开一个新窗口或这改变原来的窗口,如果你直接在js中调用window.open()函数去打开一个新窗口,浏览器会拦截你,那么如何避免呢,感兴趣的朋友可以了解下本文或许对你学习有所帮助
    2013-02-02
  • Bootstrap表单Form全面解析

    Bootstrap表单Form全面解析

    在进行自己的后台改版时,大体布局都使用了bootstrap,剩下的表单部分没理由不去使用它,对于表单的美化和布局,bootstrap做的也是很不错的。下文给大家介绍Bootstrap表单Form全面解析,感兴趣的朋友一起看下吧
    2016-06-06
  • 利用Math.js解决JS计算小数精度丢失问题

    利用Math.js解决JS计算小数精度丢失问题

    电商系统中订单、库存中有数字等加减乘除算术,下面这篇文章主要给大家介绍了关于利用Math.js解决JS计算小数精度丢失问题的相关资料,mathjs是一个前端在计算上面必定会用到的类库,需要的朋友可以参考下
    2022-04-04
  • JavaScript栏目列表隐藏/显示简单实现

    JavaScript栏目列表隐藏/显示简单实现

    隐藏侧边栏,并将图片换成右箭头图片;显示侧边栏,并将图片换成左箭头,这样的效果想必大家都很熟悉吧,接下来实现下,感兴趣的朋友可以参考下哈
    2013-04-04
  • JS比较2个日期间隔的示例代码

    JS比较2个日期间隔的示例代码

    这篇文章主要介绍了JS比较2个日期间隔的方法,需要的朋友可以参考下
    2014-04-04
  • js模态对话框使用方法详解

    js模态对话框使用方法详解

    这篇文章主要为大家详细介绍了js模态对话框的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • JavaScript三种绑定事件方式及相互之间的区别分析

    JavaScript三种绑定事件方式及相互之间的区别分析

    这篇文章主要介绍了JavaScript三种绑定事件方式及相互之间的区别,结合具体实例形式分析了javascript事件绑定方式的基本实现方法与相互之间的区别,需要的朋友可以参考下
    2017-01-01

最新评论