JavaScript进阶:js的一些学习笔记-this指向,call,apply,bind,防抖,节流

文章目录

        • 1. this指向
          • 1. 箭头函数 this的指向
        • 2. 改变this的指向
          • 1. call()
          • 2. apply()
          • 3. bind()
        • 3. 防抖和节流
          • 1. 防抖
          • 2. 节流

1. this指向
1. 箭头函数 this的指向
  • 箭头函数默认帮我们绑定外层this的值,所以在箭头函数中this的值和外层的this是一样的
  • 箭头函数中的this引用的就是最近作用域中的this
  • 向外层作用域下,一层一层查找this,知道有this的定义

注意:

  1. 事件回调函数使用箭头函数时,this为全局的window,因此dom事件回调函数如果里面需要用到dom对象的this,不推荐使用箭头函数

    const btn = document.querySelector('button');/*btn.addEventListener('click',function(){console.log(this);// this指向btn})*/btn.addEventListener('click',()=>{console.log(this);// this 指向window
    })
    
  2. 基于原型的面向对象也不推荐采用箭头函数

    function Person(){}
    Person.prototype.play = function(){console.log(this);// this 指向Person
    }Person.prototype.walk = ()=>{console.log(this);// this 指向window
    }const p1 = new Person();
    p1.play();
    p1.walk();
    
2. 改变this的指向
1. call()

使用call方法调用函数,同时指定被调用函数中this的值

function fn(x,y){console.log(this);// 指向windowconsole.log(x,y);
}
fn();const obj = {name:'liuze'
}fn.call(obj,1,2);
// 此时fn里边的this指向obj,1,2相当于实参
2. apply()

fun.apply(thisArg,[argsArray])

  • thisArg:在fun函数运行时指定的this值

  • argsArray:传递的值,必须包含在数组里面

  • 返回值就是函数的返回值

function fn(x,y){console.log(this);// 指向windowconsole.log(x,y);return x+y;
}
fn();const obj = {name:'liuze'
}const res = fn.apply(obj,[1,2]);
// 此时fn函数中的this指向obj
console.log(res);
// 3
3. bind()

不会调用函数,但是能改变函数内部this的指向

fun.bind(thisArg,arg1,arg2,…)

  • thisArg:在fun函数运行时指定this的值
  • arg1,arg2:传递的其他参数
  • 返回由指定的this值和初始化参数改造的原函数拷贝(新函数)
  • 如果只是想改变this指向,并且不香调用这个函数的时候,可以使用bind
function fn(x,y){console.log(this);// 指向windowconsole.log(x,y);return x+y;
}
fn();const obj = {name:'liuze'
}const fun2 = fn.bind(obj,1,2);
// 此时fn函数中的this指向obj
console.log(fun2());
3. 防抖和节流
1. 防抖

单位时间内,频繁触发事件,只执行最后一次

使用场景

搜索框搜索输入,只需用户最后一次输入完,再发送请求。

利用防抖来处理-鼠标划过盒子显示文字

<!DOCTYPE html>
<html>
<head><title>javascript</title><style type="text/css">*{margin: 0;padding: 0;}.box{width: 200px;height: 200px;background-color: red;margin: 0 auto;line-height: 200px;text-align: center;}</style>
</head>
<body><div class="box">1</div>
</body><script type="text/javascript">const box = document.querySelector('.box');var i = 1;box.addEventListener('mousemove',function(){box.innerHTML = i ++;})</script>
</html>

运行结果:
在这里插入图片描述

实现方式:

  1. lodash提供的防抖来处理

    const box = document.querySelector('.box');
    var i = 1;
    function mouseMove(){box.innerHTML = i ++;
    }
    box.addEventListener('mousemove',_.debounce(mouseMove,500))
    // 1. 利用lodash库实现防抖,500ms之后采取+1
    
  2. 手写一个防抖函数来处理

    const box = document.querySelector('.box');
    var i = 1;
    var timer = null;
    box.addEventListener('mousemove',function(){if(timer != null){clearTimeout(timer);}timer = setTimeout(()=>{box.innerHTML = i++;},500);// 休眠500ms
    })	
    

运行结果:

在这里插入图片描述

2. 节流

单位时间内,频繁触发事件,只执行一次

实现方式:

  1. 利用lodash提供的节流来实现

    const box = document.querySelector('.box');
    var i = 1;
    function mouseMove(){box.innerHTML = i++;
    }
    box.addEventListener('mousemove',_.throttle(mouseMove,3000));
    
  2. 手写一个防抖函数来处理

    const box = document.querySelector('.box');
    var i = 1;
    var timer = null;	
    box.addEventListener('mousemove',function(){if(!timer){timer = setTimeout(function(){box.innerHTML = i++;timer = null;},3000);}
    });
    

运行结果:

请添加图片描述

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

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

相关文章

TSINGSEE青犀AI智能分析网关V4拍照检测算法介绍及其场景应用

随着科技的飞速发展&#xff0c;防止拍摄屏幕的AI检测算法已经成为了一个备受关注的话题。未经允许拍摄屏幕的行为往往涉及到版权、隐私和安全等问题。为了解决这一问题&#xff0c;防止拍摄屏幕的AI检测算法也因此诞生。这种算法的应用场景广泛&#xff0c;如在线教育、企业培…

JVM-5

1.选择垃圾收集器 如果你的堆大小不是很大&#xff08;比如 100MB &#xff09;&#xff0c;选择串行收集器一般是效率最高的。 参数&#xff1a; -XX:UseSerialGC 。如果你的应用运行在单核的机器上&#xff0c;或者你的虚拟机核数只有单核&#xff0c;选择串行收集器依然是合…

linux用git拉取我云端以及git处理冲突

拉取后切换一个跟云端分支(dev)一样的 git branch --set-upstream-toorigin/dev dev 之后就同步了 A在dev分支写了iii,提交 B在dev分支写了hhh,提交,冲突 怎么修改,B把云端的拉下来,随便改改就行

考研模拟面试-答案【攻略】

考研模拟面试-答案【攻略】 前言版权推荐考研模拟面试-答案前面的问题通用问题专业题数据结构计算机网络操作系统数据库网络安全 手写题数据结构操作系统计算机网络 代码题基础代码题其他代码题 后面的问题补充题目 基础代码题答案链栈循环队列1循环队列2哈希表 最后 前言 202…

FPGA静态时序分析与约束(三)、读懂vivado时序报告

系列文章目录 FPGA静态时序分析与约束&#xff08;一&#xff09;、理解亚稳态 FPGA静态时序分析与约束&#xff08;二&#xff09;、时序分析 文章目录 系列文章目录前言一、时序分析回顾二、打开vivado任意工程2.1 工程布局路由成功后&#xff0c;点击vivado左侧**IMPLEMENT…

OCP NVME SSD规范解读-12.Telemetry日志要求

以NVME SSD为例&#xff0c;通常大家想到的是观察SMAR-log定位异常&#xff0c;但是这个信息在多数情况下无法只能支撑完整的定位链路。 定位能力的缺失和低效是数据中心问题解决最大的障碍。 为了解决这个问题&#xff0c;Meta的做法是推进OCP组织加入延迟记录页面。同时NVME协…

三、项目经理的角色

三、项目经理的角色 1、概述 2、项目经理的影响力范围 ​ 3、项目经理的能力 PMI人才三角形 项目经理要求的逐步变化 名词解释&#xff1a; ​ 领导力&#xff1a;领导力是一种影响力&#xff0c;领导即是一种影响过程&#xff0c;是影响人们心甘情愿和满怀热情的为实现组…

QT中dumpcpp以及dumpdoc使用

qt中调用COM的方式方法有四种&#xff0c;参考解释在 Qt 中使用 ActiveX 控件和 COM (runebook.dev) 介绍dumpcpp的使用方法Qt - dumpcpp 工具 (ActiveQt) (runebook.dev)&#xff1a; 在安装好了的qt电脑上&#xff0c;通过powershell窗口来实现&#xff0c;powershell比cmd要…

网络安全专题第一篇:网络安全的来源

目录 一.网络安全的由来。 二.网络安全漏洞在哪里 三.网络安全规范操作 1.从业务入手 2.从安全体系入手 3.从管理入手 四.可能遇到的网络攻击 1.DDOS 2.勒索攻击 3.单包攻击 4.员工删库跑路 5.熊猫烧香 五.应对方法 1.清洗 2.提高服务器的承受能力 3.防火墙 4…

AtomoVideo:AIGC赋能下的电商视频动效生成

✍&#x1f3fb; 本文作者&#xff1a;凌潼、依竹、桅桔、逾溪 1. 概述 当今电商领域&#xff0c;内容营销的形式正日趋多样化&#xff0c;视频内容以其生动鲜明的视觉体验和迅捷高效的信息传播能力&#xff0c;为商家创造了新的机遇。消费者对视频内容的偏好驱动了视频创意供给…

【SpringBoot】头条新闻项目实现CRUD登录注册

文章目录 一、头条案例介绍二、技术栈介绍三、前端搭建四、基于SpringBoot搭建项目基础架构4.1 数据库脚本执行4.2 搭建SprintBoot工程4.2.1 导入依赖:4.2.2 编写配置4.2.3 工具类准备 4.3 MybatisX逆向工程 五、后台功能开发5.1 用户模块开发5.1.1 jwt 和 token 介绍5.1.2 jwt…

4.10.CVAT——3D对象标注

文章目录 1. 创建任务2. 3D 任务工作区3.标准 3D 模式 Standard 3D mode4. 用长方体进行注释4.1. 用shapes进行注释4.2. 使用长方体进行跟踪Tracking 使用 3D 注释工具来标记 3D 对象和场景&#xff0c;例如车辆、建筑物、景观等。 1. 创建任务 要创建 3D 任务&#xff0c;您必…