前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【深入理解JS核心技术】3. 调用、应用和绑定有什么区别

【深入理解JS核心技术】3. 调用、应用和绑定有什么区别

作者头像
达达前端
发布于 2022-05-11 13:19:54
发布于 2022-05-11 13:19:54
40100
代码可运行
举报
文章被收录于专栏:达达前端达达前端
运行总次数:0
代码可运行

一起养成写作习惯!5月1/31

call, apply, bind之间的区别:

  1. call()方法调用一个给定this值和参数一一提供的函数。
代码语言:javascript
代码运行次数:0
运行
复制
var person = { lastName: '哪吒' };

function invite(greeting1, greeting2) {
 console.log(
  greeting1 + " " + this.lastName + " " + greeting2
 );
}

invite.call(person, "Hello", "How are you"); // Hello  哪吒 How are you
复制代码
  1. apply()使用给定值调用函数this并允许您将参数座位数组传递

apply()方法会接收两个参数:函数内this的值和一个参数数组。第二个参数可以是Array的实例,也可以是arguments对象。

代码语言:javascript
代码运行次数:0
运行
复制
function sum(num1, num2) {
 return num1 + num2;
}

function callSum1(num1, num2) {
 return sum.apply(this, arguments); // 传入arguments对象
}

function callSum2(num1, num2) {
 return sum.apply(this, [num1, num2]); // 传入数组
}

console.log(callSum1(10, 10)); // 20
console.log(callSum2(10, 10)); // 20
复制代码
代码语言:javascript
代码运行次数:0
运行
复制
var person = { lastName: '哪吒' };

function invite(greeting1, greeting2) {
 console.log(
  greeting1 + " " + this.lastName + " " + greeting2
 );
}

invite.apply(person, ["Hello", "How are you"]); // Hello  哪吒 How are you
复制代码
  1. bind()返回一个新函数,允许您传递任何数量的参数

ES5定义一个新方法:bind()。(bind方法会创建一个新的函数实例,其this值会被绑定到传给bind()的对象)

代码语言:javascript
代码运行次数:0
运行
复制
var employee1 = { firstName: "a", lastName: "aa" };
var employee2 = { firstName: "d", lastName: "dd" };

function invite(greeting1, greeting2) {
  console.log(
    greeting1 + " " + this.firstName + " " + this.lastName + ", " + greeting2
  );
}

var inviteEmployee1 = invite.bind(employee1); // 创建新函数并绑定对象
var inviteEmployee2 = invite.bind(employee2);
inviteEmployee1("Hello", "How are you?"); // Hello a aa, How are you?
inviteEmployee2("Hello", "How are you?"); // Hello d dd, How are you?
复制代码

call和apply是可以互换的,两者都立即执行当前函数。您需要决定是否更容易发送数组或逗号分隔的参数列表。而bind创建一个新的函数,该函数将this设置为传递给bind()的第一个参数。

call()和apply()方法都会以指定的this值来调用函数,即会设置调用函数时函数体内this对象的值。call()和apply()真正强大的地方并不是给函数传参,而是控制函数 调用上下文 即函数体内this值的能力。

代码语言:javascript
代码运行次数:0
运行
复制
window.color = "red";
let o = {
 color: 'blue'
};

function sayColor() {
 console.log(this.color);
}

sayColor(); // red

sayColor.call(this); // red
sayColor.call(window); // red
sayColor.call(o); // blue
复制代码

使用call()和apply()的好处是可以将任意对象设置为任意函数的作用域,这样对象可以不用关心方法。

未完结!更多内容尽情期待下一节~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
手写apply/call/bind/new等代码
new 关键字调用的基本过程 1)创建一个新对象 2)继承父类原型的方法 3)添加父类属性到新对象上,并初始化,并保存方法的执行结果 4)如果执行结果有返回值,并且是一个对象,返回执行的结果,否则返回新创建的对象
epoos
2022/06/06
2120
【深入理解JS核心技术】12. 什么是一阶函数
ECMAScript6的所有函数对象都会暴露一个只读的name属性,其中包含关于函数的信息。多数情况下,这个属性中保存的就是一个函数标识符,或者说是一个字符串化的变量名。即使函数没有名称,也会如实显示成空字符串。如果它是使用Function构造函数创建的,则会标识成“anonymous".
达达前端
2022/05/11
3210
js中this指向问题及call,apply,bind的区别
在标准函数中,this 指向的是把函数当成方法调用的上下文对象。也就是说在哪里调用的这个函数,那这个this只会指向它外面最靠近它的对象。
潜心专研的小张同学
2023/01/03
1.2K0
js中this指向问题及call,apply,bind的区别
分享30个你必须知道的JS基础知识
今天这篇文章整理了30个你必须知道的关于JavaScript的常识点,无论你是面试还是日常开发,都会给你很大的帮助。
前端达人
2023/08/31
3100
分享30个你必须知道的JS基础知识
JS 语法糖 1 —— 箭头函数
从 ECMAScript 6 开始,JS 新增了一种新的函数:箭头函数(Arrow Function)。
恋喵大鲤鱼
2021/02/22
2.1K0
js程序设计02——变量、作用域问题
首先,ECMAScript中的数据类型分为基本类型、引用类型,基本类型的访问操作是按值的。引用类型的值是保存在内存中的对象,操作对象时,实际上操作的是对象的引用,而非对象自身。“javascript高
用户1141560
2017/12/26
9840
js程序设计02——变量、作用域问题
es6箭头函数的理解及面试题
箭头函数是es6当中对函数的一种全新表示法。其将函数的简洁性发扬到了极致!先来看一个最简单的箭头函数:
用户1272076
2019/03/26
8590
JS-我待this如初见
何为this? this是对象,是在运行时基于函数的执行环境(和对象有关)绑定的,首先,当代码没执行前,或没执行到之前,this 是没有指向的,所以 切记:在函数中this到底取何值,是在函数真正被调用执行的时候确定的,函数定义的时候确定不了。因为this的取值是执行上下文环境的一部分,每次调用函数,都会产生一个新的执行上下文环境。 this只要一出现,一定牵扯到函数和对象 一般方法:首先分析this所在的函数是被当做哪个对象的方法调用的,则该对象就是this所引用的对象。 其实,this的取值,分五种情况
双愚
2018/05/28
7130
javascript冷知识
  如果放在数值前的话,对数值不会产生任何影响,不过放在其他的数据类型前面的话,就等于调用number()将他转为数字,布尔值false被转为0,ture被转为1
嘿嘿嘿
2018/09/10
5770
javascript冷知识
javascript 函数详解
一、函数的一些基础概念: 1.js中的函数使用function来声明。 2.关于return: 2.1  函数在执行到return语句后悔立即停止并退出,return后面的代码永远不会得到执行; 2.2  函数不必指定是否返回值,只要return语句后跟要返回的值即可实现返回值; 2.3  return语句不带任何返回值时,会返回undefined值,这种做法一般用在需要提前停止函数执行而又不需要返回值的情况。 3.理解参数: 3.1  函数不介意传递进来参数个数以及类型,因为js中的参数在内部是用一个数组
柴小智
2018/04/10
8990
JavaScript(六)
ECMAScript 中的函数实际上是对象,每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。函数通常是使用函数声明语法定义的,如下:
1ess
2021/10/29
3800
送你43道JavaScript面试题
这两天的GitHub Trending repositories被一个名叫 javascript-questions的项目霸榜了,项目中记录了一些JavaScript题目。
ConardLi
2019/06/19
1.7K0
送你43道JavaScript面试题
70个JavaScript面试问题
它们是属于虚值,可以使用Boolean(value)或!!value将其转换为布尔值时,值为false。
前端迷
2020/02/19
1.5K0
70个JavaScript面试问题
Javascript 的继承总结
写惯了 TypeScript 的人很容易了解继承(extends),比如类的继承和接口的继承等,传送门:www.tslang.cn/docs/handbo… ,但是对于ES2015出现之前,JavaScript如何实现继承的呢?毫无疑问,只能通过原型链的方式实现继承,本篇主要是在读书时遇到了原型继承的问题,回顾以下原型继承的集中方式并整理成笔记方便日后查阅。
Meteors
2021/12/08
2790
【译】《Understanding ECMAScript6》- 第二章-函数
函数在任何一门编程语言中都是很重要的一个环节。JavaScript至今已有多年的历史,但是它的函数仍然停留在很初级的阶段。函数问题的大量堆积,以及某些函数非常微妙的功能差异,很容易产生错误,并且有时候一个很简单的功能往往需要通过大量的代码来实现。 ES6吸取了多年来JavaScript开发者的反馈,在ES5函数的基础上进行了大量的改进,令JavaScript程序更加健壮并且减少了错误发生率。 默认参数 JavaScript函数的特性之一,便是接受传入的参数可以与函数定义的参数数量不同。利用这种特性,函数可以
寒月十八
2018/01/30
1.4K0
前端开发之彻底搞懂this指向
在常见的编程语言中,几乎都有this这个关键字(Objective-C中使用的是self),但是JavaScript中的this和常见的面向对象语言中的this不太一样:
青梅煮码
2023/03/13
1K0
看完这几道 JavaScript 面试题,让你与考官对答如流(中)
IIFE或立即调用的函数表达式是在创建或声明后将被调用或执行的函数。 创建IIFE的语法是,将function (){}包裹在在括号()内,然后再用另一个括号()调用它,如:(function(){})()
前端小智@大迁世界
2022/06/15
2.1K0
JavaScript 进阶问题列表[每日前端夜话0x95]
来源:https://github.com/lydiahallie/javascript-questions
疯狂的技术宅
2019/07/17
1.4K0
JavaScript 进阶问题列表[每日前端夜话0x95]
爬虫逆向基础,理解 JavaScript 模块化编程 webpack
在分析一些站点的 JavaScript 代码时,比较简单的代码,函数通常都是一个一个的,例如:
K哥爬虫
2021/10/21
7100
爬虫逆向基础,理解 JavaScript 模块化编程 webpack
js call方法_recall
最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧。
全栈程序员站长
2022/11/01
9270
相关推荐
手写apply/call/bind/new等代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档