Javascript中call,apply,bind方法的详解与总结

Javascript中call,apply,bind方法的详解与总结

在Javascript中,call、apply和bind是Function对象的三个原生方法,它们的作用都是改变函数中this的指向。虽然功能类似,但是它们的实现方式和使用场景略有不同。

call()方法

call()方法的作用是在指定的this值和参数下调用函数。语法如下:

function.call(thisArg, arg1, arg2, ...)
  • thisArg:可选参数,函数的this指向的对象,如果该参数没有传入,则默认指向window/global对象。
  • arg1, arg2, ...:可选参数,表示调用函数时传入的参数。

当使用call()调用函数时,会把调用该函数的对象作为第一个参数,然后依次传入其他参数执行该函数。

示例1:

function multiply(num1,num2){
  return num1 * num2;
}

let result = multiply.call(null,3,4); // this指向 null
console.log(result); // 12

示例2:

var obj = {name : "张三"};
function getName(){
  return this.name;
}
var getNameByCall = getName.call(obj);  // this指向 obj
console.log(getNameByCall); // 张三

apply()方法

apply()方法和call()很像,也是调用函数并且改变函数this指向。语法如下:

function.apply(thisArg, [arg1, arg2, ...])
  • thisArg:可选参数,函数的this指向的对象,如果该参数没有传入,则默认指向window/global对象。
  • [arg1, arg2, ...]:可选参数,表示调用函数时传入的参数,要放在一个数组中。

当使用apply()调用函数时,会把调用该函数的对象作为第一个参数,然后把其他参数放在一个数组内作为第二个参数传入执行该函数。

示例1:

let arr = [1, 2, 3];
let maxNum = Math.max.apply(null,arr); // null指向this
console.log(maxNum); // 3

示例2:

let person1 = {
    name:'Sara',
    age:23,
    say:function(){
        console.log(this.name + '今年' + this.age);
    }
}

let person2 = {
    name:'Tom',
    age:25,
}

person1.say.apply(person2); // 改变了函数中的this指向,输出 Tom今年25

bind()方法

bind()方法也能调用函数并改变函数中this指向,但是和call()、apply()不同的是,bind()方法会返回一个新的函数,而call()和apply()则不会。语法如下:

function.bind(thisArg, arg1, arg2, ...)
  • thisArg:可选参数,函数的this指向的对象,如果该参数没有传入,则默认指向window/global对象。
  • arg1, arg2, ...:可选参数,表示调用函数时传入的参数。

当使用bind()调用函数时,会把调用该函数的对象作为第一个参数,然后依次传入其他参数执行该函数。

示例1:

var obj = { x: 10 };
function getX(){
  return this.x;
}
var getXByBind = getX.bind(obj); // 返回函数
console.log(getXByBind()); // 10

示例2:

function add(a,b) {
  return a + b;
}
let add5 = add.bind(null, 5); // 不指定 this,创建了一个绑定了额外参数的新函数
console.log(add5(3)); // 输出 8

let add15 = add.bind(null, 15);
console.log(add15(3)); // 输出 18

总结

call()、apply()和bind()都是函数原型上的方法,用于改变函数中this的指向。

  • call()和apply()的作用类似,只是传参方式不同,前者依次传入多个参数,后者放在数组中。
  • bind()方法不会立即执行函数,而是返回一个新的函数,方便后期再次调用。

在实际使用中,call()、apply()和bind()的使用场景有所不同,但是都是用于改变函数中this的指向,可以根据具体需求选择使用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Javascript中call,apply,bind方法的详解与总结 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • 详解AngularJS Filter(过滤器)用法

    详解AngularJS Filter(过滤器)用法 什么是AngularJS Filter? AngularJS Filter(过滤器) 是AngularJS中的一种自定义组件,它可以对要展示在AngularJS应用程序模板上的数据进行数量、格式和类型等方面的过滤或转换,相当于是数据的预处理器。使用过滤器,可以让我们更加方便,快捷地展示数据。 例如,用户搜索…

    JavaScript 2023年6月10日
    00
  • WebGL 多重纹理的使用介绍

    请听我详细介绍“WebGL 多重纹理的使用介绍”的攻略。 简介 WebGL 多重纹理是用于在 WebGL 应用程序中使用多个纹理的技术。通过多重纹理,可以在同一对象上一次性使用多个纹理图像,并在每个图像之间进行混合或叠加。这为绘制更逼真的 3D 场景提供了更多的灵活性和可能性。 多重纹理的基本概念 在 WebGL 中,多重纹理主要涉及两个核心概念:纹理单元和…

    JavaScript 2023年6月11日
    00
  • 用显卡加速,轻松把笔记本打造成取暖器的办法!

    使用显卡加速操作是一种常用的提高电脑运行效率的方法。但是如果操作不当可能会导致电脑温度过高,甚至成为取暖器。以下是几个从硬件和软件方面提高显卡性能的方法。 1. 更换散热器 现今笔记本电脑的散热系统造型多以超薄为设计,无法完全承受显卡功耗的高温状态。如果你打算长时间将笔记本打造成为取暖器,那么更换强劲散热器是必不可少的。 笔记本电脑的散热器大小都是普遍的,因…

    JavaScript 2023年5月28日
    00
  • JavaScript split()使用方法与示例

    当我们需要将一个字符串按照指定分隔符进行拆分时,JavaScript的split()方法便可以派上用场。下面我们来详细讲解如何使用split()方法。 split()方法的基本语法 stringObject.split(separator,limit) 参数说明: separator:必需。规定分隔符。可以是字符串或者一个正则表达式。如果忽略该参数则返回单独…

    JavaScript 2023年5月28日
    00
  • 又一款js时钟!transform实现时钟效果

    下面就是关于“又一款js时钟!transform实现时钟效果”的完整攻略。 1. 理解transform 在使用transform实现时钟效果之前,我们需要先理解transform。transform是CSS3的一个属性,可以用于改变元素的形状、尺寸、位置和方向等,常见的transform属性有: translate:平移 rotate:旋转 scale:缩…

    JavaScript 2023年5月27日
    00
  • js调试系列 控制台命令行API使用方法

    JS调试系列:控制台命令行API使用方法 控制台是Web浏览器开发工具的一部分,可以用于调试JavaScript代码以及检查页面元素。控制台中包含了一个强大的命令行接口,用户可以通过API直接与页面交互,从而进行调试、编辑、修改和测试。 本文将详细讲解控制台命令行API的使用方法,包括常见的API函数、参数、数据类型、输出格式等,并附带两个实例说明。 控制台…

    JavaScript 2023年5月27日
    00
  • 一些主流JS框架中DOMReady事件的实现小结

    下面我介绍一下“一些主流JS框架中DOMReady事件的实现小结”的完整攻略。 标题 概述 文档对象模型(DOM)由浏览器创建,表示网页的结构。DOM Ready(文档已准备就绪)是在页面加载完成后,但在所有图像和外部资源完成加载和处理之前运行的代码的事件。 在浏览器解析DOM、CSS,执行脚本、布局和绘制期间,大多数浏览器都支持两个事件:load 和 DO…

    JavaScript 2023年6月10日
    00
  • 详解JS模块导入导出

    下面是详解JS模块导入导出的完整攻略。 什么是模块 在JavaScript中,模块(Module)指的是一个独立的、可复用的代码块,类似于传统的库(Library)。模块的引入可以将一个大的代码块分成多个小的代码块,这样便于结构化编程、提高代码复用性、隔离变量作用域等。 模块的导入导出 JavaScript中的模块可通过导入导出机制实现模块间的代码共享。 导…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部