主要目的都是为了 更改this 上下文, 实现继承,
call
function.call (x, 'value')
-
x
为要把fun
的this
重新定向的目标, 一般用的最多的都是对象 或者方法函数 -
value
, 传值的方法是字符串
//对象
function func() {console.log(this)}
func()
// 可见this 指向的是window
// Window {stop: ?, open: ?, alert: ?, confirm: ?, prompt: ?, …}
//使用 call 更改其this指向的上下文为一个对象
var obj = {a: 1};
func.call(obj)
// {a: 1}
//方法
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat();
//通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。
//输入结果为"Cat"
animal.showName.call(cat,",");
//animal.showName.apply(cat,[]);
apply
function.apply(x, ['value'])
-
x
为要把fun
的this
重新定向的目标, 一般用的最多的都是对象 或者方法函数 -
value
, 传值的方法是数组
//对象
function func() {console.log(this)}
func()
// 可见this 指向的是window
// Window {stop: ?, open: ?, alert: ?, confirm: ?, prompt: ?, …}
//使用 apply更改其this指向的上下文为一个对象
var obj = {a: 1};
func.apply(obj)
// {a: 1}
//方法
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat();
//通过call或apply方法,将原本属于Animal对象的showName()方法交给对象cat来使用了。
//输入结果为"Cat"
animal.showName.apply(cat,[]);
bind
bind
通常用来重新绑定函数体中的this
并放回一个具有指定this
的函数,多次bind
是无效的。call
和apply
则表示重新指定this
并调用返回结果,区别在于call
采用多个实参的方式传参,apply
则是使用一个数组。共同点:第一个参数指定为
this
,第二个参数起为参数传递。不同点:
bind
是用来返回具有特定this
的函数,call
和apply
都是改变上下文中的this
并立即执行这个函数。