apply、call、bind(js基础)

2019-12-10  本文已影响0人  merrylmr

apply、call

描述:是函数内置的方法
作用:动态设置函数体内this对象的值

应用场景:

var nums=[1,4,-1,10]
var maxNum=Math.max.apply(Math,numbers)
function isArray(obj){
return Object.prototype.toString.call(obj)==='[object Array]'
}
var domNodes=Arrary.prototype.slice.call(arguments)

伪数组的对象结构:arguments,getElementBytagName等

bind

 var a = {
    num: 1,
    eventBind: function () {
     var _this=this
      document.querySelector('#box').addEventListener('click', function (event) {
        console.log(_this.num)      //1
      }.bind(this))
    }
  }

使用bind()更加优雅的解决这个问题

 var a = {
    num: 1,
    eventBind: function () {
      document.querySelector('#box').addEventListener('click', function (event) {
        console.log(this.num)      //1
      }.bind(this))
    }
  }

apply、call、bind比较

var a={
x:11
}
var b={
getX:function(){
  return this.x;
  }
}
console.log(b.getX.bind(a)()) // 11
console.log(b.getX.apply(a)) //11
console.log(b.getX.call(a)) //11

区别:当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用bind()方法。而apply/bind则会立即执行函数

实现一个call,apply,bind

  Function.prototype.applyX = function apply(thisArg, argArray) {
    // 第一条:如果调用者不是一个方法
    if (typeof this !== 'function') {
      throw new TypeError("调用者不是一个方法")
    }
    // 第二条:判断参数是null 或者是undefined
    if (typeof argArray === 'undefined' || typeof argArray === null) {
      argArray = []
    }
    // 第三条:判断参数是不是一个对象
    if (!argArray instanceof Object) {
      throw new TypeError('参数要是对象')
    }
    // this未传入,则取window
    thisArg = thisArg || window
    let __fn = Symbol()
    thisArg[__fn] = this
    let result = thisArg[__fn](...argArray)
    delete thisArg[__fn]
    return result
  }

测试

  var x = 1111

  var a = {
    x: 1212
  }

  function b() {
    console.log('info', this.x,)
  }

   b()  // 1111

  b.applyX(a) // 1212

call
Function.prototype.callX=function call(thisArg){
var argArray=[]
var argLen=arguments.length;
for(var i=0;i<argLen-1;i++){
  argArray[i]=arguments[i+1]
  }
return this.applyX(this.arg,argArray)
}
 Function.prototype.bindX = function (thisArg, ...i) {
    var _this = this
    return function (...f) {
      console.log('f', ...f, 'inner', ...i)
      return _this.applyX(thisArg || this, [...f, ...i])
    }
  }

Function 是对象

函数内部特殊对象:arguments 和this

arguments保存函数参数

argument.callee 属性:是一个指针,指向拥有这个arguments对象的函数。严格模式下报错

caller:保存调用当前行数的函数的引用

上一篇下一篇

猜你喜欢

热点阅读