改变 this 指向的方法 call()、apply()、 bind()的区别 ?

call()第一个参数是this的新指向;第二个参数是要传入函数的参数

复制代码
    let cat = {
      name: "喵喵"
    }
    let dog = {
      name: "旺财",
      eat(food) {
        console.log(this.name, "喜欢吃", food)
      },
      eatMore(food1, food2) {
        console.log(this.name, "喜欢吃", food1, food2)
      }
    }
    dog.eat("骨头"); //旺财喜欢吃骨头
    dog.eat.call(cat); // 喵喵 喜欢吃 undefined
    dog.eat.call(cat, "鱼"); // 喵喵 喜欢吃 鱼
    dog.eatMore.call(cat, "鱼", "肉"); //喵喵 喜欢吃 鱼 肉
复制代码

apply和call的区别是传参不同,apply的参数通过数组形式传递

复制代码
    let cat = {
      name: "喵喵"
    }
    let dog = {
      name: "旺财",
      eat(food) {
        console.log(this.name, "喜欢吃", food)
      },
      eatMore(food1, food2) {
        console.log(this.name, "喜欢吃", food1, food2)
      }
    }
    dog.eatMore.call(cat, "鱼", "肉"); //喵喵 喜欢吃 鱼 肉
    dog.eatMore.apply(cat, ["鱼", "肉"]);//喵喵 喜欢吃 鱼 肉
复制代码

bind的传参和call一样

bind和call,apply的区别在于,bind将函数作为返回值(即bind不会立即执行而是在下次调用的时候执行,且bind只在第一次改变this指向有效,后续再次使用不在改变this指向)

复制代码
var name = "佩奇"
    function fun() {
      console.log(this.name);
    }
    let cat = {
      name: "喵喵"
    }
    let dog = {
      name: "旺财",
    }
    fun()//佩奇
    var f1 = fun.bind(cat);
    f1(); // 喵喵

    // 第二次使用bind绑定无效
    var f2 = f1.bind(dog);
    f2(); // 喵喵

    // 使用call绑定也无效
    f1.call(dog); // 喵喵
    //使用apply无效
    f1.apply(dog); //喵喵
复制代码

 

posted @   天青色等烟雨灬  阅读(39)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
点击右上角即可分享
微信分享提示