前端面试自测知识点-- apply、call 和 bind

apply 和 call
  • func.apply(thisArg, [argsArray]) // 第一个参数:必选,第二个:可选
    
  • function.call(thisArg, arg1, arg2, ...) 
    
  • apply 传入的第一个参数 指定this的指向 第二个参数是一个数组(接收传递过来的参数)

  • call 传入的第一个参数 指定this的指向 后面的参数是 传递给函数的参数

    const arr = [1,6,3,5,29,8,7]
    let maxNumber = Math.max.apply(Math,arr)
    let maxNummer = Math.max.call(Math,...arr)
    
  • apply 改变this 指向 并传入参数(数组)

  • call改变this指向 并传入参数(一个一个的参数)

    例:伪数组使用数组方法

    var domNodes =Array.prototyope.slice.call(document.getElementsByTagName("*)
    

    同理也可以将数组的一些方法通过 apply 或者 call 的 方法 给其他伪数组使用

    function log(){
         
     var args = Array.prototype.slice.call(arguments)
    args.unshift('app')
    }
    
  • call/apply都是返回函数执行的结果

  • 辅助记忆:apply是以a开头,它传给function的参数是Array,也是以a开头的

  • 调用call/apply/bind的必须是个函数

apply、call、bind之间的区别
call和apply的唯一区别:

传给function的参数写法不同:

  • apply是第2个参数,这个参数是一个数组,要传的参数都写在数组里
  • call从第2~n的参数都是传给function
call/apply 与 bind的区别

执行:

  • call/apply 改变了函数的this上下文后,马上执行该函数
  • bind则是返回改变了上次文后的函数,不执行该函数

返回值:

  • call/apply返回function的执行结果
  • bind返回function的拷贝,并指定里function的this指向,保存了function的参数
call和apply的应用场景
  • 判断数据类型:

    Object.prototype.toString用来判断类型再合适不过,借用它我们几乎可以判断所有类型的数据:

    function isType(data, type) {
         
        const typeObj = {
         
            '[object String]': 'string',
            '[object Number]': 'number',
            '[object Boolean]': 'boolean',
            '[object Null]': 'null',
            '[object Undefined]': 'undefined',
            '[object Object]': 'object',
            '[object Array]': 'array',
            '[object Function]': 'function',
            '[object Date]': 'date', // Object.prototype.toString.call(new Date())
            '[object RegExp]': 'regExp',
            '[object Map]': 'map',
            '[object Set]': 'set',
            '[object HTMLDivElement]': 'dom', // document.querySelector('#app')<
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值