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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JS实现微信摇一摇原理解析

    JS实现微信摇一摇原理解析

    这篇文章主要为大家详细介绍了JS微信摇一摇的实现原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • javascript 另一种图片滚动切换效果思路

    javascript 另一种图片滚动切换效果思路

    把图片们用ul之类的包起来,并设置float。然后设置这个ul本身为absolute定位,其父标签用relative定位。通过设置ul的left或top值,实现图片队列的滚动效果
    2012-04-04
  • TypeScript创建一个简单Web应用

    TypeScript创建一个简单Web应用

    这篇文章主要为大家介绍了TypeScript创建一个简单Web应用,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • JavaScript深拷贝的几种实现方法实例

    JavaScript深拷贝的几种实现方法实例

    javascript深拷贝是初学者甚至有经验的开发着,都会经常遇到问题,下面这篇文章主要给大家介绍了关于JavaScript深拷贝的几种实现方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • JS维吉尼亚密码算法实现代码

    JS维吉尼亚密码算法实现代码

    我想用JS实现对文本的加密和解密,想用维吉尼亚密码算法,谁有现成代码啊
    2010-11-11
  • 详解ES6 中的Object.assign()的用法实例代码

    详解ES6 中的Object.assign()的用法实例代码

    这篇文章主要介绍了ES6 Object.assign()的用法及用途,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 详解嵌套命名空间在TypeScript中如何应用

    详解嵌套命名空间在TypeScript中如何应用

    命名空间是TypeScript中非常有用的概念,可以帮助我们组织和管理代码,避免命名冲突,下面小编就来和大家聊聊嵌套命名空间在TypeScript中是如何应用的吧
    2023-06-06
  • 前端Base64格式文件上传原理、实现与最佳实践

    前端Base64格式文件上传原理、实现与最佳实践

    Base64 上传是前端处理文件时的一个经典方案,尤其在接口只支持 JSON、需要同时传文件+其他字段、或要做图片预览的场景中非常实用,因此本文将从原理到代码,再到生产级最佳实践,一次性讲透,需要的朋友可以参考下
    2026-02-02
  • JavaScript 实现文件跳转方法示例详解

    JavaScript 实现文件跳转方法示例详解

    JavaScript页面跳转方法包括window.location、超链接、meta标签、history API和表单提交,需区分相对路径与绝对路径,单页应用推荐使用路由库(如React Router),选择方式应结合需求与项目架构,本文给大家介绍JavaScript 文件跳转方法,感兴趣的朋友一起看看吧
    2025-08-08
  • 微信小程序时间轴组件的示例代码

    微信小程序时间轴组件的示例代码

    这篇文章主要介绍了微信小程序时间轴组件,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论