博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js手写call函数
阅读量:4511 次
发布时间:2019-06-08

本文共 1113 字,大约阅读时间需要 3 分钟。

Function.prototype.myCall = function (context, ...arr) {    if (context === null || context === undefined) {       // 指定为 null 和 undefined 的 this 值会自动指向全局对象(浏览器中为window)        context = window     } else {        context = Object(context) // 值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的实例对象    }    const specialPrototype = Symbol('特殊属性Symbol') // 用于临时储存函数    context[specialPrototype] = this; // 函数的this指向隐式绑定到context上    let result = context[specialPrototype](...arr); // 通过隐式绑定执行函数并传递参数    delete context[specialPrototype]; // 删除上下文对象的属性    return result; // 返回函数执行结果};
let test = {    name: "test"}, fun = {    fn: function () {          console.log(this.name)    }}fun.fn.myCall(test)
context[specialPrototype] = this; 这句话的个人理解 这个函数里面context是当你使用myCall的this指向对象 当你使用上面方法之后相当于在这个指向对象里面新增了一个key为specialPrototype,value为函数的this的键值对(this的指向问题,当你使用myCall的时候,this是调用myCall的函数,即上面的fun.fn,即最终是在context里面新增了一个specialPrototype:fun.fn) context[specialPrototype](...arr);当你执行这行代码的时候 其实是调用了fun.fn,但是这个时候 里面的this的指向变为调用specialPrototype的context 就这样context中的this就完成代替了fun.fn中的this
 

转载于:https://www.cnblogs.com/web-chuan/p/11592261.html

你可能感兴趣的文章
ClickOnce清单签名取消后依然读取证书的问题
查看>>
POJ 1083
查看>>
IIS7的HTTP到HTTPS的重定向
查看>>
学习安排
查看>>
帝国cms 列表页分页样式修改美化【2】
查看>>
PL/SQL database character set(AL32UTF8) and Client character set(ZHS16GBK) are different
查看>>
2808 SCI 中断接收
查看>>
51单片机 | 定时器中断应用实例
查看>>
011 查找结点,创建节点,插入节点以及小练习
查看>>
Linux 7个运行级别(0:关机,停机模式、1:单用户模式、2:多用户模式、3:完整的多用户文本模式、4:系统未使用,保留一般不用、5:图形化模式、6:重启模式)、重置root密码方法...
查看>>
UITableViewCell的4种显示格式
查看>>
类之string类、Math类、DateTime类
查看>>
linux系统中如何确定是否存在某个命令
查看>>
安防RTSP无插件直播方案及RTSP配置规则
查看>>
[转载]oracle的表导入导出,表空间,用户名
查看>>
iOS小技巧:用runtime 解决UIButton 重复点击问题
查看>>
POJ 2253 Dijkstra
查看>>
闲言碎语话心得--凭什么是他(她)
查看>>
20130328
查看>>
UITableViewCell contentView layoutSubviews 死循环
查看>>