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);
        }
    });

运行结果:

相关推荐
AOI小白新手上路1 分钟前
4-1_地址空间_RISC与CISC_学习笔记
笔记·学习
Vcaker4 分钟前
Linux学习36-k8s集群升级及kube-vip高可用
linux·运维·学习
Hilaku8 分钟前
我重写了整个项目,但没人感谢我!
前端·javascript·程序员
probex_16 分钟前
学习笔记:知识图谱落地实践
笔记·学习·知识图谱
AOI小白新手上路17 分钟前
4-3_ARM汇编_学习笔记
汇编·arm开发·学习
kkkkkkkkkk_Z27 分钟前
新手自学嵌入式 | 学习日记:ARM架构初探与基础概念梳理
arm开发·学习·架构
鬓戈42 分钟前
开源中文输入法技术调研与自建方案
学习·开源
福兮说1 小时前
JS 正则的六个坑:带 g 的 test() 一真一假、空匹配死循环、replace 里的 $
开发语言·前端·javascript·正则表达式
miss1 小时前
给规则引擎加一个拖拽画布:Vue Flow 单向投影 + 布局语义分离
javascript·vue.js·canvas
摇滚侠1 小时前
《Spring Boot 3:高级与架构设计》第 2 章 IOC 容器的高级机制 编程式驱动 IOC 阅读笔记 7
java·spring boot·笔记