call appply bind:
首先呢他们都是用来改变this指向的,但是他们也有区别
区别:
1,传参不同:call通过“,”分隔的形式传递参数,前面是函数名
例:函数名.call(目标对象,参数一,参数二)
apply参数使用数组进行传参
例:函数名.apply(目标对象,参数一,参数二)
bind传参“,”分隔开,因为bind返回的是一个函数所以调用要加上括号
例:函数名.bind(目标对象,参数一,参数二)()
2,函数是否执行:首先呢call和apply都是直接调用的,而bind上需要加上小括号才能调用
call apply实现原理
call实现原理:call的原理是基于函数来实现的,
主要做的事情是,给目标对象添加一个临时事件,实现后删除这个临时的事件,这个方法用到
了argument来接收参数,在接收参数的时要去掉参数的第一个obj事件,利用eval执行字符串
的方法
apply实现原理:apply基本是与call一样的实现原理,不过在接受参数的for循环时,它的参数是一个数组所
已不用去删除第一个参数就可以了
new的原理
1,new的特点:
new一个构造函数会自动return一个对象
new完的实例化对象__proto__ 是自动指向构造函数的原型
new构造函数传参自动赋给当前实例化对象
防抖和节流
1,防抖:类似于 电梯 屏保 类的
在固定时间内没有触发事件会在固定时间结束后触发,如果在固定时间内触发了就会延长固定时间
防抖主要利用定时器实现
function debounce(func,wait) {
var timer=null;
return function() {
//保存当前调用的dom对象
var _this=this;
//保存事件对象
var args=arguments;
clearTimeout(timer)
timer=setTimeout(function() {
func.apply(_this,args)
},wait)
}
2,节流:无论固定时间内是否触发,都会在固定时间后触发
节流的实现方法有两种
第一种:时间戳
//时间戳版本实现节流
function throttle(func,wait) {
//定义初始时间
var oldTime=0;
return function() {
var _this=this;
var args=arguments;
//当前时间戳
var newTime=+new Date();
//判断用当前时间减去旧的时间,如果大于wait指定的时间就会触发
if(newTime-oldTime>wait) {
//执行触发的函数
func.apply(_this,args)
//将旧时间更新
oldTime=newTime;
}
}
第二种:定时器
//时间戳版本实现节流
function throttle(func,wait) {
var timer=null;
return function() {
var _this=this;
var args=arguments;
if(!timer) {
timer=setTimeout(function() {
timer=null;
func.apply(_this,args)
},wait)
}
}
}