JavaScript 5 call bind apply

150 阅读1分钟

call,apply,bind 是Function.prototype下的方法,作用是执行下一个目标函数的时候把函数中的this指向改变。

call

例1 
let obj1 = {
    name: "张三",
    age: 20,
    say: function () {
    console.log("name:" + this.name + ",age" + this.age)
    }
}
let obj2 = {
    name: "李四",
    age: 22
}
obj1.say() // name:张三,age20
obj1.say.call(obj2) // name:李四,age22
obj1.say.apply(obj2) // name:李四,age22
obj1.say.bind(obj2)() // name:李四,age22

call,apply,bind 都实现了想要的结果,bind返回的是一个函数,需要()来调用它。

例2
let obj1 = {
    name: "张三",
    age: 20,
    say: function (love1, love2) {
        console.log("name:" + this.name + ",age" + this.age + ",爱好是" + love1 + '和' + love2)
    }
}
let obj2 = {
    name: "李四",
    age: 22
}
obj1.say("唱歌", "跳舞") // name:张三,age20,爱好是唱歌和跳舞
obj1.say.call(obj2, "唱歌", "跳舞") // name:李四,age22,爱好是唱歌和跳舞
// obj1.say.apply(obj2, "唱歌", "跳舞") // 报错
obj1.say.bind(obj2)("唱歌", "跳舞") // name:李四,age22,爱好是唱歌和跳舞

obj1.say(["唱歌", "跳舞"]) // name:张三,age20,爱好是唱歌,跳舞和undefined
obj1.say.call(obj2, ["唱歌", "跳舞"]) // name:李四,age22,爱好是唱歌,跳舞和undefined
obj1.say.apply(obj2, ["唱歌", "跳舞"])  // name:李四,age22,爱好是唱歌和跳舞
obj1.say.bind(obj2)(["唱歌", "跳舞"]) // name:李四,age22,爱好是唱歌,跳舞和undefined

call,apply,bind的第一个参数都是obj2,但是参数不一样了 call和bind都是 字符串多个参数,apply的参数只能是数组。