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

文章目录

        • [1. this指向](#1. this指向)
          • [1. 箭头函数 this的指向](#1. 箭头函数 this的指向)
        • [2. 改变this的指向](#2. 改变this的指向)
          • [1. call()](#1. call())
          • [2. apply()](#2. apply())
          • [3. bind()](#3. bind())
        • [3. 防抖和节流](#3. 防抖和节流)
          • [1. 防抖](#1. 防抖)
          • [2. 节流](#2. 节流)
1. this指向
1. 箭头函数 this的指向
  • 箭头函数默认帮我们绑定外层this的值,所以在箭头函数中this的值和外层的this是一样的
  • 箭头函数中的this引用的就是最近作用域中的this
  • 向外层作用域下,一层一层查找this,知道有this的定义

注意:

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

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

    js 复制代码
    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的值

js 复制代码
function fn(x,y){
    console.log(this);
    // 指向window
    console.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:传递的值,必须包含在数组里面

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

js 复制代码
function fn(x,y){
    console.log(this);
    // 指向window
    console.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
js 复制代码
function fn(x,y){
    console.log(this);
    // 指向window
    console.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. 防抖

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

使用场景

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

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

html 复制代码
<!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提供的防抖来处理

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

    js 复制代码
    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提供的节流来实现

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

    js 复制代码
    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);
        }
    });

运行结果:

相关推荐
The Chosen One9858 小时前
计算机知识点的理解开悟后的分享(一)
笔记
喜欢吃鱿鱼8 小时前
DES加解密(附带解决转义问题)-VUE
开发语言·前端·javascript
Jenlybein9 小时前
速学 VS Code 插件开发入门,客制化你的开发体验
前端·javascript·visual studio code
徐新帅9 小时前
4181:【GESP2603七级】拆分
c++·学习·算法·信奥赛
敢敢のwings9 小时前
NVIDIA Thor学习之 |在Jetson AGX Thor上部署OpenClaw并基于Ollama的边缘AI协作实战(二)
人工智能·学习
独孤九剑打醒他9 小时前
#原创声明 #拒绝白嫖 #技术立场 #创作者保护
笔记
avocado_green9 小时前
【考驾照】科目一备考笔记(个人手工整理,非AI生成)
笔记
三分钟管理实战案例9 小时前
华恒智信助力传统制造与科技服务行业完成激活组织效能,打破“躺平”困局
学习
ZC跨境爬虫10 小时前
UI前端美化技能提升日志day7:(原生苹方字体全局适配+合规页脚完整像素级落地)
前端·javascript·ui·html·交互
好运的阿财10 小时前
OpenClaw工具拆解之tts+web_search
前端·javascript·python·ai·ai编程·openclaw·openclaw工具