您现在的位置是:群英 > 开发技术 > web开发
JS中bind、call、apply三个方法的使用不同在哪
Admin发表于 2022-05-18 17:32:30753 次浏览
这篇文章主要给大家介绍“JS中bind、call、apply三个方法的使用不同在哪”的相关知识,下文通过实际案例向大家展示操作过程,内容简单清晰,易于学习,有这方面学习需要的朋友可以参考,希望这篇“JS中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 function
fn.call(obj);

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

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

bind、call、apply 区别

  • call 和 apply 都是为了解决改变 this 的指向。作用都是相同的,只是传参的方式不同。
  • 除了第一个参数外,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 函数

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

  • 不传入第一个参数,那么默认为 window
  • 改变了 this 指向,让新的对象可以执行该函数。那么思路是否可以变成给新的对象添加一个函数,然后在执行完以后删除?

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

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]);

 更多关于js中call、apply三个方法的区别与使用方式请查看下面的相关链接


通过以上内容的阐述,相信大家对“JS中bind、call、apply三个方法的使用不同在哪”已经有了进一步的了解,更多相关的问题,欢迎关注群英网络或到群英官网咨询客服。

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: JS,call,apply
相关信息推荐
2022-08-19 17:48:41 
摘要:这篇文章主要介绍了Python的语言元素和分支循环结构,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
2022-05-06 17:58:25 
摘要:本篇文章给大家带来了关于Python的相关知识,其中主要介绍了关于Seaborn的相关问题,包括了数据可视化处理的散点图、折线图、条形图等等内容,下面一起来看一下,希望对大家有帮助。
2022-08-19 17:48:37 
摘要:这篇文章主要介绍了python-redis-lock分布式锁的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部