var a = {
user:"小明",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
b(); //undefined
var a = {
user:"小明",
fn:function(){
console.log(this.user);
}
}
a.fn(); //小明
var a = {
user:"小明",
fn:function(){
console.log(this.user); //小明
}
}
var b = a.fn;
b.call(a);
通过在call方法,给第一个参数添加要把b添加到哪个环境中
call方法除了第一个参数以外还可以添加多个参数
apply方法和call方法有些相似,它也可以改变this的指向
var a = {
user:"小明",
fn:function(){
console.log(this.user); //小明
}
}
var b = a.fn;
b.apply(a);
但是不同的是,第二个参数必须是一个数组
如果call和apply的第一个参数写的是null,那么this指向的是window对象
bind方法和call、apply方法有些不同,但是不管怎么说它们都可以用来改变this的指向。
var a = {
user:"小明",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
b.bind(a);
发现代码没有被打印,对,这就是bind和call、apply方法的不同,实际上bind方法返回的是一个修改过后的函数
var a = {
user:"小明",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
var c = b.bind(a);
console.log(c); //function() { [native code] }
我们现在执行一下函数c看看,能不能打印出对象a里面的user
var a = {
user:"小明",
fn:function(){
console.log(this.user); //小明
}
}
var b = a.fn;
var c = b.bind(a);
c();
同样bind也可以有多个参数,并且参数可以执行的时候再次添加,但是要注意的是,参数是按照形参的顺序进行的