论如何手写call(改变this指向)

在本次我们不去只有原始方式去写,大家可以先思考一下,大致整理一下思路

一、介绍

我们首先介绍一下call,以方便我们进一步去思考怎么去写

1.可以进行函数的调用

function a() {
    console.log(1)
}
a.call()//此时会打印1

2.可以修改函数的this指向

1).如果不传参数,默认this指向window

let obj = {
    a: function() {
        console.log(this)
    }
}
obj.a.call()//此时会打印window这个全局对象

2).如果只传一个参数,this指向该参数(undefined或null默认指向window)

let obj = {
    a: function() {
        console.log(this)
    }
}
let b = [1,2,3]
obj.a.call(undefined)//此时打印的还是window对象
obj.a.call(b)//此时打印的为[1,2,3]

3.如果传多个参数,this指向第一个参数,剩余的参数是参数列表

let obj = {
    a: function(b) {
        console.log(this + b)
    }
}
let c = '作者'
obj.a.call(c, '真帅')//作者真帅

二、globalThis

在这里我们首先引入一个词globalThis这个属性

globalThis这个属性包含全局的this值,可以简单理解为全局对象

当我们在任何作用域中打印globalThis

console.log(globalThis)//全局对象
function a() {
    console.log(globalThis) //同样是window这个全局对象
}
a()

三、开始手写

相信大家在这个时候大概知道该怎么写了,所以我们直接上代码

//写在函数的原型上,方便使用
Function.property.cal = function(a,...b) {
    a = a === undefined || a === null ? globalThis : Object(a)
    //当a等于null或者undefined时 a 等于全局对象
    //当a为一个其他数据时 会通过Object这个方法返回这个原本的样式
    a.fn = this 
    const c = a.fn(...b)
}
function d() {
    console.log(this)
}
function g(f) {
    console.log(this + f)
}
let e = '作者'
d.cal(window)//此时会打印window这个全局对象
g.cal(e,'真帅')//'作者真帅'

通过以上变可以实现cal方法,但大家仔细思考便会发现一个很细微的问题

那便是,如果出现重名问题怎么办,毕竟这种事情时无法避免的,但我们能否去避免这个问题呢

大家看后可以思考一下,提示一下:可以使用基本数据类型的某个数据类型(下期可能会讲解一下)

希望能帮助大家,有问题可以私信或评论哦

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值