call、apply、bind And 防抖、节流、new的实现原理

179 阅读2分钟

改变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;
 }