前端进阶--实现call方法

博客围绕call改变this指向展开思考,提出test函数为何能调用call方法,以及call方法如何改变this指向的问题,并指出实现一个call方法可解答疑问,聚焦于JavaScript中call方法的原理探究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

call改变this指向的思考
var age = 13;
function test(){
  console.log(this.age); //13
  
}
test()
var myobj = {
  age: 22
}
test.call(myobj) //22
思考一

test函数为什么可以调用call方法?

test是构造函数对象,所以是函数也是对象
test没有call方法,那么就顺着原型链网上查找,发现
test._proto_ = Function.prototyp
而Function.prototyp有call方法,于是调用call方法

  • call方法是如何来改变this指向的 ?实现一个call方法,即可明白
Function.prototype.myCall = function(obj){
  obj.fn = this
  var newArgs = []
  // 将获取到的参数放进newArgs
  for(var i = 1; len = arguments.length, i < len; i++){
    newArgs.push(args[i])
  }
  obj.fn(...newArgs)
  delete obj.fn // 使用完以后,删除添加的属性
}

var age = 13;
function test(){
  console.log(this.age); //13
  
}
test()
var myobj = {
  age: 22
}
test.myCall(myobj) // 22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值