js-函数的call方法原理是怎样的

注意,这里只是去演示原理,实际上,这个call方法内部实现方式可能会有细微差别,但原理就是这个样子。

 // 直接在Function的原型上添加
    Function.prototype.callfunc = function (context) {
        // 按照js函数接收参数的规则,这个context就是第一个传入的参数 
        // 也就是传入的要作为this 的对象 不传入,就是window
        var content = context || window
        // 在这里,应用this规则中的谁调用的这个函数,this就指向谁的原则,
        // 那个函数调用call方法,这个this就是哪个函数
        content.fn = this
        // 接下来,拿到所有传入的从第二个参数开始的参数  因为第一个参数是修改后的this
        var args = [...arguments].slice(1)
        // 在这里,是重点,content是第一个参数,也就是指定的this,
        // 通过这个this去执行fn,fn就是当成执行call方法的函数,以此实现了改变this
        var result = content.fn(...args)
        // 最后清空这个对象的引用,释放内存
        content = null
        return result
    }

    // 做个小实验
    let obj = {
        name: 'aaa'
    }
    
    function showData(age) {
        console.log(this.name)
        console.log(age);
    }
    showData.call(obj,13)
    showData.callfunc(obj,13)
    // 果然结果一样
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值