posts - 29,comments - 0,views - 6632
  call apply bind
用法 function.call(thisArg,arg1,arg2,arg3...)    
功能 使用一个指定的this值和单独给出的一个或者多个参数来调用一个函数。    创建一个新的函数, 当被调用时,将其this关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列
返回值 使用调用者提供的this值和参数调用该函数的返回值,若方法无返回值,返回undefined。    
注意点

1.this可以传null或者undefined,此时this指向window;

2.this参数可以传基本数据类型,原生call会自动用Object()转换;

3.函数是可以有返回值的;

4.将函数添加到指定对象中,用delete删除(消除副作用)

 整体与call类似,apply调用的时候,第二个参数是个数组  
步骤

1.获取第一个参数,构建对象

2.将对应函数传入该对象

3.获取参数并执行相应函数

4.删除该对象中的函数,消除副作用

5返回结果

 

1、将函数设置为对象的属性;

2、处理传入的参数;

3、返回函数的定义/引用;

4、外层执行接收的函数;

5、删除对象上第一步设置的函数;

 

1.call函数

Function.prototype.myCall = function(){
  let target = arguments[0]|| window || global
  target.fn = this
  let args = Array.from(arguments).slice(1)
  let result = target.fn(...args)
  delete target.fn
  return result 
}

 

2.apply函数

Function.prototype.myApply = function(){
  let target = arguments[0]|| window || global
  target.fn = this
  let args = Array.from(arguments)[1]
  let result = target.fn(...args)
  delete target.fn
  return result 
}

 

3.bind函数

复制代码
Function.prototype.myBind = function(context) {
    const _this = this
    const args = [...arguments].slice(1)
    console.log(this)
    // 返回一个函数
    return function F() {
        // 因为返回了一个函数,我们可以 new F(),所以需要判断
        if (this instanceof F) {
            // 忽略传入的this
            return new _this(...args, ...arguments)
        }
        // 直接调用,将两边的参数拼接起来
      
        return _this.apply(context, args.concat(...arguments))
    }
}
复制代码

 

posted on   皮五辣子  阅读(53)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示