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

运行结果:

相关推荐
炫饭第一名1 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
进击的尘埃3 小时前
Vue3 响应式原理:从 Proxy 到依赖收集,手撸一个迷你 reactivity
javascript
willow3 小时前
JavaScript数据类型整理1
javascript
LeeYaMaster3 小时前
20个例子掌握RxJS——第十一章实现 WebSocket 消息节流
javascript·angular.js
UIUV4 小时前
RAG技术学习笔记(含实操解析)
javascript·langchain·llm
颜酱6 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
FansUnion6 小时前
我如何用 Next.js + Supabase + Cloudflare R2 搭建壁纸销售平台——月成本接近 $0
javascript
左夕7 小时前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
滕青山8 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js
时光不负努力8 小时前
编程常用模式集合
前端·javascript·typescript