call()、apply()、bind() 都是用来重定义 this对象的
例1:
var name='小李',age=18;
var obj = {
name:'小白',
objAge:this.age,
myFun:function(){
console.log( this.name + "年龄" + this.age);
}
}
obj.objAge; //18
obj.myFun() //小白年龄 undefined
例2:
var fav = '大佬'
function shows(){
console.log(this.fav);
}
shows() //大佬
比较一下例1例2中 this 的差别,第一个打印里面的 this 指向 obj,第二个全局声明的 shows() 函数 this 是 window ;
使用情况:
var name='小李',age=18;
var obj = {
name:'小白',
objAge:this.age,
myFun:function(){
console.log( this.name + "年龄" + this.age + "梦想" + this.dream + "喜欢" + this.like);
}
}
var obj1 = {
name:'咸鱼',
age:3
}
obj.myFun.call(obj1,'赚大钱','玩手机'); // 咸鱼年龄 3 梦想赚大钱喜欢玩手机
obj.myFun.apply(obj1,['赚大钱','玩手机']); // 咸鱼年龄 3 梦想赚大钱喜欢玩手机
obj.myFun.bind(obj1,'赚大钱','玩手机')(); // 咸鱼年龄 3 梦想赚大钱喜欢玩手机
obj.myFun.bind(obj1,['赚大钱','玩手机'])(); // 咸鱼年龄 3 梦想赚大钱,玩手机喜欢 undefined
call()
和apply()
的第一个实参都是变成this的值,哪怕传入的实参是原始值或者甚至是null或者undefined。
对于call()
来说,第一个调用上下文实参之后的所有参数都是要传入待调用函数的值。
对于apply()
来说,只有两个参数,第一个实参和call()一样,第二个实参则必须是一个数组,也就是说,要把待用函数的参数以数组的格式传进去。
bind()
方法是将函数绑定至某个对象。
当在函数f()上调用bind()
方法,并传入一个对象o作为参数,这个方法将返回一个新的函数。以函数调用的方式调用新的函数,将会把原始的函数f会被当做o的方法来调用。
它是返回一个新的函数,不会立即执行。需要使用bind()();
真正的bind()方法返回一个函数对象,这个函数对象的length属性是绑定函数的形参个数减去绑定实参的个数(length的长度不能小于0)
function fn (y,z){
return this.x + y + z;
}
var fn1 = fn.bind({ x : 1 } , 2);
fn1(3); //6
//如果我们fn(3,4) 应该会报错,提示我们传入的参数多了