改变this指向的三种方式:
call、apply、bind,自己对着三种方式也是有一个大概的了解
call 特点:
1、改变this指向
2、使用时候函数已被执行
3、传参时候以逗号的形式分开,一个一个传递 //Fn2.call(上下文环境obj,‘’,‘’)
apply 特点:
1、改变this指向
2、使用时候函数已被执行
3、传参时候必须以一个类数组或数组的形式传递,不然的话会报错 //Fn2.apply(上下文环境obj, [18, 20])
bind 特点:
1、改变this指向
2、返回的是函数本分,函数并没有执行,需要通过事件触发后才会执行,
3、传参的话和call的形式是一样的,都是通过逗号的形式分割,一个一个传递 //Fn.bind(上下文环境obj, 'username', '20岁')()
如果着三个中上下问环境为null或者undefined的时候,默认就指向了window 比如:函数名.call(null)
防抖和节流,这两个的话,都是前端开发中解决优化的方案,
比如: 1、搜索时候,当用户输入时候一直向后端发送请求的话,请求次数会很多,可能会影响页面的性能, 2、scroll滚动条滚动到底部时候过两秒在向服务器发送请求,而不是一种高频的向服务器发送请求,影响页面的性能。
防抖的话就是: 在一个时间内执行一件事,如果在这段事件内,你干了其他事情,那么刚刚过去的那段时间就算浪费了,又得从头计算,如果着中间你没有干其它事情,那么就会返回预期的结果。
节流: 在一个时间内执行一件事,不管你中间有没有干其它的事情,只要到一定的时间,就会给你返回结果
new的实现原理
1.new一个构造函数时,中间发生了什么? 2.或者new一个构造函数,中间执行了哪些步骤?
第一步:创建一个临时对象obj
第二步:获取构造函数赋值给Constructor
第三步:将obj的原型指向Constructor的原型,目的可以让实例化对象找到构造器原型上的方法
第四步:让Constructor属性作用于obj上,从而可以操作this.xxx的实例属性
第五步:返回临时对象obj
function new1() {
// 创建一个临时对象
var obj={};
//获取构造函数赋值给Constructor
var Constructor=[].shift.apply(arguments)
//然后arguments中的值只能除第一个值之外的参数了
//将obj的原型指向Constructor的原型,目的可以让实例化对象找到构造器原型上的方法
obj.__proto__=Constructor.prototype
//让Constructor属性作用于obj上,从而可以操作this.xxx的实例属性
Constructor.apply(obj,arguments)
//返回obj
return obj;
}