js的this与call,apply,bind

简介: js的this与call,apply,bind

this绑定方式(共4种方式):默认绑定、隐式绑定、硬绑定(call,apply,bind)、new绑定

this的五种情况分析
this执行主体,谁把它执行的「和在哪创建&在哪执行都没有必然的关系」

函数执行,看方法前面是否有“点”,没有“点”,this是window「严格模式下是undefined」,有“点”,“点”前面是谁this就是谁
给当前元素的某个事件行为绑定方法,当事件行为触发,方法中的this是当前元素本身「排除attachEvent」
构造函数体中的this是当前类的实例
箭头函数中没有执行主体,所用到的this都是其所处上下文中的this
可以基于Function.prototype上的call/apply/bind去改变this指向
手撕call/bind/apply源码
手撕call 原理:就是利用 “点”定this机制,context.xxx=self “obj.xxx=function ” => obj.xxx()

Function.prototype._call = function (context, ...params) {
   
        if (typeof context === "function") {
   
          throw new TypeError('参数类型错误');
          return;
        }
        let key = Symbol('fun');
        context = context || window;
        context[key] = this;
        context[key](...params);
        delete context[key];
      };

手撕bind (把function执行并且改变this即可 args->是执行proxy的时候可能传递的值)

Function.prototype._bind = function (context, ...params) {
   
        if (typeof context === "function") {
   
          throw new TypeError('参数类型错误');
          return;
        }
        let self = this;
        context = context || window;
        return function (...arg) {
   
          let key = Symbol('fun');
          context[key] = self;
          context[key](...[...params, ...arg]);
          delete context[key];
        };
      };

手撕apply

Function.prototype._apply = function (context, params) {
   
        if (typeof context === "function") {
   
          throw new TypeError('参数类型错误');
          return;
        }
        let key = Symbol('fun');
        context = context || window;
        context[key] = this;
        context[key](...params);
        delete context[key];
      };
相关文章
|
5天前
|
自然语言处理 JavaScript 前端开发
JS中this的应用场景,再了解下apply、call和bind!
该文章深入探讨了JavaScript中`this`关键字的多种应用场景,并详细解释了`apply`、`call`和`bind`这三个函数方法的使用技巧和差异。
|
8天前
|
JavaScript 前端开发
this指向的几种情况以及js简单实现call、apply、bind___六卿
本文讨论了JavaScript中`this`的指向规则,并提供了`call`、`apply`和`bind`方法的简单实现,用于改变函数的`this`指向。
10 0
this指向的几种情况以及js简单实现call、apply、bind___六卿
|
2月前
|
JavaScript 前端开发
js 中call()和apply()
js 中call()和apply()
32 0
|
2月前
|
JavaScript 前端开发
深入浅出 妙用Javascript中apply、call、bind
【8月更文挑战第1天】深入浅出 妙用Javascript中apply、call、bind
21 0
|
5月前
|
前端开发 JavaScript
前端 JS 经典:apply、call、bind
前端 JS 经典:apply、call、bind
90 0
|
JavaScript 前端开发
js apply、call、bind一篇掌握
js apply、call、bind一篇掌握
js apply、call、bind一篇掌握
|
前端开发 JavaScript
一个简单的例子让你轻松地明白JavaScript中apply、call、bind三者的用法及区别
这篇文章也算是讲解了前端面试 常考的知识点 ,即关于JavaScript中apply、call、bind三者的用法及区别。 如果有些小伙伴已经对该知识有一定的了解了,可以直接跳到最后看 总结
124 0
|
自然语言处理 JavaScript 前端开发
JS中this的应用场景,再了解下apply、call和bind!
在下面的这边文章中,将讲解关于this的几大应用场景以及了解在面试中经常会被问到的apply、bind和call究竟是什么,接下来开始进入本文的讲解。
|
JavaScript
js之apply call bind 区别
js之apply call bind 区别
5095 0
|
Web App开发 缓存 JavaScript
从零开始学 Web 之 JS 高级(三)apply与call,bind,闭包和沙箱
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http://www.cnblogs.com/lvonve/ CSDN:https://blog.csdn.net/lvonve/ 在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。
1425 0