js(七)this

1、this的五种情况

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

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

2、call、apply、bind

callapply的唯一区别是参数,第一个参数都是要绑定的上下文
call可以有多个参数,剩余参数被认为是传递给方法的参数
apply第二个参数为一个数据,是传递给方法参数的集合

func.call(obj, 10, 20);
func.apply(obj, [10, 20]);

call

原理:利用**'点’定THIS**机制,context.xxx=self “obj.xxx=func” => obj.xxx()
注意:原始值比如n=10;n.xxx=100不报错,但是n.xxx拿不到,所以判断如果传入的this上下文不是对象,转为对象

  • 把func中的this改为obj
  • 并且把params接收的值当做实参传递给func函数
  • 并且让func函数立即执行
Function.prototype.call = function call(context, ...params) {// this/self->func  context->obj  params->[10,20]let self = this,key = Symbol('KEY'), //加的属性不能影响原始obj中的属性result;context == null ? context = window : null;!/^(object|function)$/i.test(typeof context) ? context = Object(context) : null; //原始值加属性不报错,但是拿不到值 判断是否为对象 不是则改为对象context[key] = self;result = context[key](...params);delete context[key];return result;
};

bind

  • 和call/apply的区别:并没有把func立即执行
  • 把传递进来的obj/10/20等信息存储起来「闭包」
  • 执行bind返回一个新的函数 例如:proxy,把proxy绑定给元素的事件,当事件触发执行的是返回的proxy,在proxy内部,再去把func执行,把this和值都改变为之前存储的那些内容

Function.prototype.bind = function bind(context, ...params) {// this/self->func  context->obj  params->[10,20]let self = this;return function proxy(...args) {// 把func执行并且改变this即可  args->是执行proxy的时候可能传递的值self.apply(context, params.concat(args));};
};

普通函数的调用 + 柯里化的实现
如果是正常的普通函数的调用方法来调用bind返回的函数,那么直接返回像调用call函数那样返回,第一个参数值就是传入bind的asThis值。注意要将前后传入的参数(两次…arg收集到的)同时收集到call函数的参数中,从而实现柯里化。

通过new操作符调用 + 柯里化的实现
如果通过new来调用bind生成的函数(绑定函数)情况又有所不同了

Function.prototype.bind2 = function(asThis,...args) {//这里的this就是调用bind2的函数(普通函数this指向调用者)if (typeof this !== "function") {throw new TypeError("Not a Function");}//  这里保存调用bind的函数以及传给bind后面的参数。var origin = this;let  args0 = args;function bound(...args) {if(this instanceof bound) //如果是new的形式来使用绑定函数的return new origin( ...args0,...args)else //如果是普通函数的形式来使用绑定函数的(基本上与call、apply无区别,实现柯里化即可)return origin.call(asThis, ...args0,...args);}bound.prototype = origin.prototype;return bound;}

3、鸭子方法

类数组像数组「结构、一些操作…」,我们让其用数组上的方法「不能直接用」

/* Array.prototype.slice = function slice() {  不传参数是浅拷贝,克隆arr返回一个新数组let result = [];for (let i = 0; i < this.length; i++) {result.push(this[i]);}return result;
}; */
// 克隆arr返回一个新数组
// arr.slice();// 掌握this的好玩应用:鸭子类型
//   像鸭子,我们就说他是鸭子 -> 类数组像数组「结构、一些操作...」,我们让其用数组上的方法「不能直接用」
function func() {console.log(arguments); //js把传入到这个函数的全部参数存储在一个叫做arguments的东西里面// 把arguments变为数组,这样就可以用数组的办法了:Array.from/[...arguments]/...let result = [];for (let i = 0; i < arguments.length; i++) {result.push(arguments[i]);} //  Array.prototype.slice -> [].slice  // let result = Array.prototype.slice.call(arguments);// console.log(result);[].forEach.call(arguments, item => {console.log(item);});
}
func(10, 20, 30); 

4、绑定规则

new绑定》显示绑定》隐式绑定》默认绑定

默认绑定:独立函数调用,可以把默认绑定看作是无法应用其他规则时的默认规则,this指向全局对象。

var name = 'Jenny';
function person() {return this.name;
}
console.log(person());  //Jenny

隐式绑定
当函数引用有上下文对象时,隐式绑定规则会把函数中的this绑定到这个上下文对象。对象属性引用链中只有上一层或者说最后一层在调用中起作用。

函数还可以作为某个对象的方法调用,这时this就指这个上级对象

function test() {console.log(this.x);
}var obj = {};
obj.x = 1;
obj.m = test;obj.m(); // 1

这个函数中包含多个对象,尽管这个函数是被最外层的对象所调用,this指向的也只是它上一级的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/313.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1g的视频怎么做二维码?较大视频如何生成二维码?

现在很多参与评选活动时&#xff0c;会制作好相关的视频内容&#xff0c;然后生成二维码之后&#xff0c;发送给活动管理人员从而参与评选。在根据要求录制视频时&#xff0c;有些视频会因为时间太长&#xff0c;导致文件过大&#xff0c;那么如何将超过1g的等视频生成二维码&a…

基于DEF生成LIB的方法

基于DEF生成LIB的方法 [生成64位lib] lib /def:libcurl-x64.def /MACHINE:x64 /OUT:libcurl-x64.lib[生成32位lib] lib /def:libcurl-x64.def /OUT:libcurl-x64.lib

物联网的技术架构及应用层是什么?

物联网的技术架构包括感知层、网络层、平台层和应用层。 感知层是物联网的第一层&#xff0c;它的主要功能是收集各种数据和信息。感知层可以通过各种传感器和执行器来收集物品的数据和信息&#xff0c;例如温度、湿度、位置、重量等等。感知层还需要考虑如何实现低功耗、低成…

OpenCV 图像处理算法和技术的应用实践

OpenCV 图像处理算法和技术的应用实践 导语一、图像滤波算法二、图像分割技术三、特征提取与描述算法四、实践示例&#xff1a;图像风格转换总结 导语 图像处理算法和技术在计算机视觉和图像处理领域发挥着重要作用&#xff0c;通过对图像进行分析、增强和转换&#xff0c;可以…

c#调用vtk显示dicom序列

public static void test2() { // 创建 DICOM 阅读器 vtkDICOMImageReader reader vtkDICOMImageReader.New(); //小端字节 reader.SetDataByteOrderToLittleEndian(); reader.SetDirectoryName("D…

2023机器人操作系统(ROS)暑期学校预热-线下时间/地点-(转发)

原文地址&#xff1a; https://mp.weixin.qq.com/s/McjBgCpecL6OMgpcrPyY_Q 中国机器人操作系统&#xff08;ROS&#xff09;暑期学校自2015年举办以来&#xff0c;被中国机器人业界和学界&#xff0c;以及ROS开源基金会誉为除了ROSCon之外规模最大、参与人数最多、最成功的RO…

什么是Heatmap(热图)图表?用DHTMLX可实现快速构建

DHTMLX Chart是DHTMLX最新发布的JavaScript UI小部件库的核心内容之一&#xff0c;这个图表小部件收到了几个重要的更新&#xff0c;但其中最引人注目的是一个新的数据可视化选项——日历热图。 DHTMLX专注于JavaScript和HTML5 UI小部件和库&#xff0c;以帮助开发人员更快地构…

基于springboot+vue的疫情管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

不外传秘诀| docker 快速搭建常用的服务环境

本文主要给大家介绍如何使用 docker 搭建常用的服务环境&#xff0c; 包括mysql,reedis,nginx,jenkins 等常用的环境&#xff0c;下面直接进入主题。 1、MySQL 部署 ①搜索 MySQL 镜像 docker search mysql ②拉取 MySQL 镜像 docker pull mysql:5.7 ③创建容器&#xf…

基于STM32单片机的智能家居烟雾温度火灾防盗报警的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;LCD1602液晶显示屏来显示显示测得的值&#xff1b;SR501人体红外感应是否有人进行防盗&#xff1b;通过烟雾传感器MQ-2获取前的烟雾值&#xff1b;通过DHT11温湿度传感器来获取当前的温湿度&#xff1b;所有的信息通过通过esp82…

php通过IP获取用户当前所在城市

php获取当前用户所在城市 php通过ip免申请api获取所在城市的代码包括省市区sql数据 <?php function getName($pinyin,$lv){$servername "localhost";$username "root";$password "root";$dbname "ttx";try {$conn new PDO(…

机器学习15:神经网络-Neural Networks

神经网络是特征交叉的更复杂版本。本质上&#xff0c;神经网络会学习适当的特征组合。本文主要介绍神经网络的结构、隐藏层、激活函数等内容。 目录 1.神经网络&#xff1a;结构 2.隐藏层 3.激活函数 3.1 常用激活函数 3.2 小结 4.神经网络小练习 4.1 第一个神经网络 …

Jina AI 受邀出席 WAIC 2023「科技无障碍」论坛,与行业专家共话 AI 普惠未来

7 月 6 日&#xff0c;2023 世界人工智能大会&#xff08;WAIC&#xff09;在上海世博中心及世博展览馆开幕&#xff0c;并在浦东张江、徐汇西岸设分会场&#xff0c;同步在闵行等产业集聚区开展同期活动。本届大会由上海市人民政府和国家发改委、工信部、科技部、国家网信办、…

基于JSP+Servlet的医药药品管理系统

用户类型&#xff1a;双角色角色&#xff08;患者、管理员[医生]&#xff09; 设计模式&#xff1a;MVC&#xff08;jspservletjavabean) 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 主要技术&#xff1a;jsp、servlet、jdbc、jsp、html5、jquery、css、js…

RabbitMQ之交换机

RabbitMQ之交换机 1. Exchanges1.1 Exchanges 概念1.2 Exchanges 的类型1.3 无名 exchange 2. 临时队列3. 绑定&#xff08;bindings&#xff09;4. Fanout4.1 Fanout 介绍4.2 Fanout 实战 5. Direct exchange5.1 Direct exchange 介绍5.2 多重绑定5.3 实战 6. Topics6.1 之前类…

亚马逊云科技143项安全标准与合规性认证,帮助企业满足安全合规要求

在亚马逊云科技&#xff0c;为满足客户不断变化的需求&#xff0c;亚马逊云科技持续创新与迭代&#xff0c;设计的服务能帮助客户满足最严格的安全和合规性要求。针对安全相关工作&#xff0c;亚马逊云科技服务团队与Amazon Security Guardians云守护者项目密切配合&#xff0c…

JVM系统优化实践(18):GC生产环境案例(一)

生产环境中&#xff0c;最常见的一种案例就是OOM&#xff0c;也叫「内存溢出」&#xff0c;它表示JVM已经无法支撑业务系统的运行。而很多工程师都没有类似处理线上系统故障的经验&#xff0c;尤其是这种突发的故障。那么&#xff1a; 1、为什么会OOM&#xff1f;&#xff08;…

linux终端前面显示base和不显示base

问题描述&#xff1a;前提是系统里装了anaconda3&#xff0c;有时候两个服务器之间相连长时间没使用或者访问时候前面没显示base。。 解决&#xff1a;我们在做深度学习时需要一个环境&#xff0c;如果前面没显示base的话&#xff0c;你直接conda activate是激活不了我们需要跑…

降级npm后,出现xxx 不是内部或外部命令解决方法

比如我安装了anyproxy npm install anyproxy -g 之后在cmd中输入anyproxy 发现 anyproxy 不是内部或外部命令解决方法. 一般出现这样的问题原因是npm安装出现了问题&#xff0c;全局模块目录没有被添加到系统环境变量。 Windows用户检查下npm的目录是否加入了系统变量P…

实例014 OutLook界面

实例说明 程序主界面包括菜单栏、工具栏、状态栏和树状视图。OutLook界面美观、友好&#xff0c;是一个很实用的程序主界面&#xff0c;并且菜单栏和工具栏是可移动的。运行本例效果如图1.14所示。 图1.14 Out Look界面 技术要点 一般程序的菜单栏和工具栏是不可移动的&…