call 函数

语法

obj.call(thisObj,arg[,arg2[,arg3[,...agr]]]);

简介

修改obj的this指向为thisObj,后面的参数会当成obj的参数安装顺序传递进去。

我们先来看一下下面这段代码会输出什么:

function say(arg1, arg2) {console.log(this.name, arg1, arg2);
}const obj = {name: "tom",say: function () {console.log(this.name);}
};
say();

输出结果:

我们发现报错了,程序并没有找到name
现在我们来改动一下,使用call函数来改变this的指向,看看会发生什么:

say.call(obj, "1", "2");

发现输出的结果变成了:

call把say函数的this变为了obj。

实现

下面我们来实现一个call函数

Function.prototype._call = function (context) {// 判断是否是一个函数// this指的是调用的函数if (typeof this !== "function") {throw new TypeError("Error");}context = context || window;context.fn = this;const args = [...arguments].slice(1);const result = context.fn(...args);delete context.fn;return result;
};

验证一下:

say._call(obj, "1", "2");

发现输出结果与期望的相同。

apply函数

语法

obj.call(thisObj[,argArray]);

简介

applycall函数的用法相同,只是参数的传递变成了数组形式。

say.apply(obj, ["1", "2"]);

输出的结果与调用call相同:

实现

Function.prototype._apply = function (context, args) {// 判断是否是一个函数// this指的是调用的函数if (typeof this !== "function") {throw new TypeError("Error");}context = context || window;context.fn = this;let result = null;if (args) {result = context.fn(...args);} else {result = context.fn();}delete context.fn;return result;};

bind 函数

语法

obj.bind(thisObj,arg[,arg2[,arg3[,...agr]]]);

简介

bind函数会返回一个新函数,但是不会像call和apply一样立即执行函数,bind后面的参数会当成obj的参数安装顺序传递进去。

我们先来看两段代码

const s = say.bind(obj, "1", "2");s();
const s = say.bind(obj);s("1", "2");

发现这两段代码输出的结果是一样的。

实现

我们利用apply来实现一下bind函数:

Function.prototype._bind = function (context) {// 判断是否是一个函数if (typeof this !== "function") {throw new TypeError("Error");}const args = [...arguments].slice(1);const fn = this;const F = function () {},fBound = function () {return fn.apply(this instanceof F && context ? this : context || window,args.concat(...arguments));};F.prototype = this.prototype;fBound.prototype = new F();return fBound;};

JS修改this指向:call、apply和bind函数相关推荐

  1. JS中的call、apply、bind方法详解

    bind 是返回对应函数,便于稍后调用:apply .call 则是立即调用 . apply.call 在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(co ...

  2. call、apply、bind函数详解

     我们都知道call,apply,bind函数都是为了改变this的指向,那么对于三种函数有什么相同点有什么不太点或者有什么应用呢?下面我们来进行介绍 call与apply函数  在javascrip ...

  3. 手写 call、apply 及 bind 函数

    之前在bind和apply以及call函数使用中详解总结过bind和apply以及call函数的使用,下面手写一下三个函数. 一.首先call函数 Function.prototype.MyCall ...

  4. Atitit.js this错误指向window的解决方案

    Atitit.js this错误指向window的解决方案 1.1. 出现地点and解决之道1 1.2. call,apply和bind这三个方法2 1.2.1. Function.prototype ...

  5. call()和apply()及bind( )三者的相同与区别

    call( )方法 1.call可以调用函数 fn.call( ) 2.call可以改变this指向(call函数的第一个参数就是call所有调用函数里的this指向) 3.call函数的第二个及以后 ...

  6. 实现一个bind函数

    目前的打算还是继续深入前端基础知识,所以打算从polyfill开始做起. bind函数 bind函数最常见的用法是绑定函数的上下文,比如在setTimeout中的this一般都是指向window,如果 ...

  7. 手写一个bind函数

    我们先看代码,bind 函数的使用方法 function test(a, b, c) {console.log(a, b, c);console.log('this', this)return '我是 ...

  8. 【JavaScript】bind函数是怎么实现的 手动实现bind函数

    手动实现bind函数 bind函数语法 函数内的this指向 原理分析 1.bind函数是函数调用的,而js中函数可以视作对象,当bind作为对象方法时,函数内部this指向该对象本身,那么此时调用t ...

  9. 理解js中的this指向以及call,apply,bind方法

    <script> function a(){var user = "追梦子";console.log(this.user); //undefinedconsole.lo ...

最新文章

  1. yo 搭建angular应用
  2. 使用Mybatis-Generator自动生成Dao、Model、Mapping相关文件(转)
  3. 一个简单的JDBC通用工具
  4. java uuid静态方法_Java UUID nameUUIDFromBytes()方法及示例
  5. 梯度的直观理解_BP反向传播算法的思考和直观理解 -卷积小白的随机世界
  6. python获取当前线程_Python爬虫(线程,进程)
  7. UHDTV (超高清电视)的色域与取样精度及格式
  8. java+lodop+vue+热敏打印机,打印图片
  9. For循环执行顺序流程
  10. Windows Server 2003安装应用程序时,提示缺失kernel.dll文件
  11. 使用Tushare库下载股票数据
  12. html实现宿舍管理系统,宿舍管理系统部分代码实现
  13. pythonxy官网下载_spyder安装包
  14. 何谓自顶向下,何谓自底向上
  15. Python计算股票收益率、Alpha和Beta系数
  16. VB中关于Array函数与Split函数
  17. ThinkPHP 5.0常用助手函数
  18. 关于for循环的一些题目(二)
  19. ubuntu ble c语言编程,Ubuntu通过蓝牙连手机上网
  20. 微雪电子SIM7000C NB-IOT Emqx MQTT 通信的详细测试过程

热门文章

  1. H3C 交换机DRNI特性使用介绍
  2. pl/sql编程----触发器
  3. 51单片机应用篇-- --智能门锁
  4. PHP知识点总结(一)
  5. 选购手机时,运行内存和处理器先考虑哪个?来说说你的观点
  6. 大治河西枢纽二线船闸总体设计(水利设计资料)
  7. 互联网乱世之下 一将功成万骨枯
  8. 夜晚拍照出现耀斑的原因
  9. J2ME(cldc/midp)简介
  10. 特里回归战世界杯 英足总主席力挺 霍奇森已拒绝