文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JavaScript中bind、call、apply方法怎么使用

2023-06-30 12:03

关注

这篇文章主要讲解了“JavaScript中bind、call、apply方法怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript中bind、call、apply方法怎么使用”吧!

call的基本使用

var ary = [12, 23, 34];ary.slice();

以上两行简单的代码的执行过程为:ary这个实例通过原型链的查找机制找到Array.prototype上的slice方法,让找到的slice方法执行,在执行slice方法的过程中才把ary数组进行了截取。

注意slice方法执行之前有一个在原型上查找的过程(当前实例中没有找到,再根据原型链查找)。

当知道了一个对象调用方法会有一个查找过程之后,我们再看:

var obj = {name:'iceman'};function fn() {    console.log(this);    console.log(this.name);}fn(); // this --> window// obj.fn(); // Uncaught TypeError: obj.fn is not a functionfn.call(obj);

call方法的作用:首先寻找call方法,最后通过原型链在Function的原型中找到call方法,然后让call方法执行,在执行call方法的时候,让fn方法中的this变为第一个参数值obj,最后再把fn这个函数执行。

知道这个原型上的原理后,咱们就可以动手分析实现这三个方法了。

bind、call、apply 区别

let a = {    value: 1}function getValue(name, age) {    console.log(name)    console.log(age)    console.log(this.value)}getValue.call(a, 'yck', '24')getValue.apply(a, ['yck', '24'])

bind 和其他两个方法作用也是一致的,只是该方法会返回一个函数。并且我们可以通过 bind 实现柯里化

如何实现一个 bind 函数

对于实现以下几个函数,可以从几个方面思考

当然是肯定的,于是我们可以这样写:

Function.prototype.myBind = function (context) {  if (typeof this !== 'function') {    throw new TypeError('Error')  }  var _this = this  var args = [...arguments].slice(1)  // 返回一个函数  return function F() {    // 因为返回了一个函数,我们可以 new F(),所以需要判断    if (this instanceof F) {      return new _this(...args, ...arguments)    }    return _this.apply(context, args.concat(...arguments))  }}

如何实现一个 call 函数

Function.prototype.myCall = function (context,...arg) {  var context = context || window  // 给 context 添加一个属性  // getValue.call(a, 'yck', '24') => a.fn = getValue  //使用symbol 选择一个独一无二的值作为新添加的属性  let symbol = new Symbol();  context[symbol] = this;  let result = context[symbol](...arg)  // 删除添加的函数  delete context[symbol]    return result}

如何实现一个apply 函数

apply实现原理与call实现基本类似,只有传值的方式不一样。

Function.prototype.myApply = function (context,arg) {  var context = context || window // 给 context 添加一个属性 // getValue.call(a, 'yck', '24') => a.fn = getValue //使用symbol 选择一个独一无二的值作为新添加的属性 let symbol = new Symbol(); context[symbol] = this; let result = context[symbol](arg) // 删除添加的函数 delete context[symbol] return result}

经过对以上的函数进行检测 , 完美通过。

const obj = {   name : 'xiaoxiao',   getName : function (arg) {   console.log(`我是${this.name}里面的,我里面有${arg}`);   }  }  obj.getName([0,0,0,0,0]); // 我是xiaoxiao里面的  const obj2 = {   name : 'huahua'  }  //传值不一样  obj.getName.myCall(obj2,1,1,1,1,1,1);  obj.getName.myBind(obj2)(2,2,2,2,2,2);  obj.getName.myApply(obj2,[3,3,3,3,3,3]);

感谢各位的阅读,以上就是“JavaScript中bind、call、apply方法怎么使用”的内容了,经过本文的学习后,相信大家对JavaScript中bind、call、apply方法怎么使用这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯