文章目录
-
-
-
- [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的定义
注意:
-
事件回调函数使用箭头函数时,this为全局的window,因此dom事件回调函数如果里面需要用到dom对象的this,不推荐使用箭头函数
jsconst btn = document.querySelector('button'); /*btn.addEventListener('click',function(){ console.log(this); // this指向btn })*/ btn.addEventListener('click',()=>{ console.log(this); // this 指向window })
-
基于原型的面向对象也不推荐采用箭头函数
jsfunction 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>
运行结果:
实现方式:
-
lodash提供的防抖来处理
jsconst box = document.querySelector('.box'); var i = 1; function mouseMove(){ box.innerHTML = i ++; } box.addEventListener('mousemove',_.debounce(mouseMove,500)) // 1. 利用lodash库实现防抖,500ms之后采取+1
-
手写一个防抖函数来处理
jsconst 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. 节流
单位时间内,频繁触发事件,只执行一次
实现方式:
-
利用lodash提供的节流来实现
jsconst box = document.querySelector('.box'); var i = 1; function mouseMove(){ box.innerHTML = i++; } box.addEventListener('mousemove',_.throttle(mouseMove,3000));
-
手写一个防抖函数来处理
jsconst 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); } });
运行结果: