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.mzph.cn/news/748188.shtml

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

相关文章

Pytorch nn.Module

一、torch.nn简介 torch.nn是 PyTorch 中用于构建神经网络的模块。它提供了一系列的类和函数&#xff0c;用于定义神经网络的各种层、损失函数、优化器等。 torch.nn提供的类&#xff1a; Module: 所有神经网络模型的基类&#xff0c;用于定义自定义神经网络模型。Linear: 线…

Spring-1

目录 概念 优点 Autowired和Resource关键字 相同点 不同点 依赖注入的三种方式 概念 Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用&#xff0c;但是有些扩展是针对构建J2EE&#xff08;Java平台企业版&#xff09;平台的web应用。Spring 框架目…

前端算法 - 面试记录

1. 实现两个字符串相加&#xff08;不能直接转成数字使用加法运算&#xff0c;因为js精度规定不能超出一定长度&#xff09; 现场写法完善&#xff1a; function addStr(a, b) {let res let j 0const add (x, y) > {let numif (x y > 10) {num x y j - 10j 1}e…

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.03.10-2024.03.15

论文目录~ 1.3D-VLA: A 3D Vision-Language-Action Generative World Model2.PosSAM: Panoptic Open-vocabulary Segment Anything3.Anomaly Detection by Adapting a pre-trained Vision Language Model4.Introducing Routing Functions to Vision-Language Parameter-Efficie…

java-ssm-jsp-基于java的客户管理系统的设计与实现

java-ssm-jsp-基于java的客户管理系统的设计与实现 获取源码——》公主号&#xff1a;计算机专业毕设大全

自习室预订系统|基于springboot框架+ Mysql+Java+B/S架构的自习室预订系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 学生功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参…

DirectShowPlayerService::doSetUrlSource: Unresolved error code 0x800c000d

报出这个问题&#xff0c;应该是对给的url解析不正确&#xff0c;我给的是rtsp的视频流地址&#xff0c;应该是对该格式解析异常。 所以参考两篇文&#xff1a; QT无法播放视频&#xff1a;报错&#xff1a;DirectShowPlayerService::doRender: Unresolved error code 0x8004…

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

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

练习题手撕总结

基础篇 1.基础知识&#xff08;时间复杂度、空间复杂度等&#xff09; 2.线性表&#xff08;顺序表、单链表&#xff09; 3.双链表、循环链表 4.队列 5.栈 6.递归算法 7.树、二叉树&#xff08;递归、非递归遍历&#xff09; 8.二叉搜索树&#xff08;BST&#xff09; 9.二分查…

Android Studio实现内容丰富的安卓宠物医院管理系统

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目编号128 1.开发环境android stuido jdk1.8 eclipse mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册登录 2.系统公告 3.宠物社区&#xff08;可发布宠物帖子&#xf…

Boyer Moore 算法介绍

1. Boyer Moore 算法介绍 Boyer Moore 算法&#xff1a;简称为 BM 算法&#xff0c;是由它的两位发明者 Robert S. Boyer 和 J Strother Moore 的名字来命名的。BM 算法是他们在 1977 年提出的高效字符串搜索算法。在实际应用中&#xff0c;比 KMP 算法要快 3~5 倍。 BM 算法思…

数据结构 之 队列(Queue)

​​​​​​​ &#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff0…

IO流——缓冲流

缓冲流 缓冲流作用&#xff1a;对原始流进行包装&#xff0c;以提高原始流读写数据的性能 字节缓冲流 作用&#xff1a;提高字节流读写数据的性能原理&#xff1a;字节缓冲输入流自带了8KB的缓冲池&#xff0c;字节缓冲输出流也自带了8KB的缓冲池 构造器说明public Buffer…

JAVA爬虫系列

目录 准备工作 yml 1.入门程序&#xff08;获取到静态页面&#xff09; 2.HttpClient---Get 2.1 修改成连接池 3.HttpClient---Get带参数 3.1 修改成连接池 4.HttpClient---Post 4.1 修改成连接池 5.HttpClient---Post带参数 6.HttpClient-连接池 7.设置请求信息 …

蓝桥真题——-小蓝重组质数(全排列和质数判断)

小蓝有一个十进制正整数n&#xff0c;其不包含数码0&#xff0c;现在小蓝可以任意打乱数码的顺序&#xff0c;小蓝想知道通过打乱数码顺序,n 可以变成多少个不同的质数。 #include <iostream> #include<bits/stdc.h> using namespace std; bool isprime(int n) {if…

讯鹏Andon系统解决方案帮助工厂打造生产过程透明化

在现代制造业中&#xff0c;高效透明的生产管理模式对企业的发展至关重要。Andon系统作为一种解决方案&#xff0c;通过软硬件结合的方式&#xff0c;为企业打造了高效透明的生产管理模式&#xff0c;帮助企业实现生产过程的优化和管理的可视化。 Andon系统的软硬件结合为企业提…

swiftUI中的可变属性和封装

swiftUI的可变属性 关于swift中的属性&#xff0c;声明常量使用let &#xff0c; 声明变量使用var 如果需要在swiftUI中更改视图变化那么就需要在 var前面加上state 。 通过挂载到state列表 &#xff0c;从而让xcode找到对应的改变的值 例子&#xff1a; import SwiftUIstruc…

【兆易创新GD32H759I-EVAL开发板】图像处理加速器(IPA)的应用

GD32H7系列的IPA&#xff08;Image Pixel Accelerator&#xff09;是一个高效的图像处理硬件加速器&#xff0c;专门设计用于加速图像处理操作&#xff0c;如像素格式转换、图像旋转、缩放等。它的优势在于能够利用硬件加速来实现这些操作&#xff0c;相比于软件实现&#xff0…

BLE---Service interoperability requirements

0 Preface/Foreword references: Bluetooth core specification V5.4 definition&#xff1a;定义 declaration&#xff1a;声明 1 service definition&#xff08;服务定义&#xff09; 服务定义&#xff08;definition&#xff09;&#xff1a;必须包含服务声明(declara…

【JavaScript】JavaScript 运算符 ① ( 运算符分类 | 算术运算符 | 浮点数 的 算术运算 精度问题 )

文章目录 一、JavaScript 运算符1、运算符分类2、算术运算符3、浮点数 的 算术运算 精度问题 一、JavaScript 运算符 1、运算符分类 在 JavaScript 中 , 运算符 又称为 " 操作符 " , 可以实现 赋值 , 比较 > < , 算术运算 -*/ 等功能 , 运算符功能主要分为以下…