改变函数内部的this指向的三种方法:call(),apply(),bind()
1、call()改变this指向
语法: 函数.call(this, arg1, arg2, arg3, arg4)
第一个参数用来指定函数内部的this指向,后面的参数是函数执行时所需的实参。
window.color = 'red';
document.color = 'yellow';
var s1 = {color: 'blue' };
function changeColor(){
console.log(this.color);
}
changeColor.call(); //red (默认传递参数)
changeColor.call(window); //red
changeColor.call(document); //yellow
changeColor.call(this); //red
changeColor.call(s1); //blue
eg2
var Pet = {
words : '...',
speak : function (say) {
console.log(say + ''+ this.words)
}
}
Pet.speak('Speak'); // 结果:Speak...
var Dog = {
words:'Wang'
}
Pet.speak.call(Dog,'Speak') //结果 SpeakWang
2、apply()改变this指向
第一个参数用来指定函数内部的this指向;
第二个参数要求是一个数组或者伪数组,apply会把它平铺然后传入对应的函数中.
function Pet(words){
this.words = words;
this.speak = function () {
console.log( this.words)
}
}
function Dog(words){
//Pet.call(this, words); //结果: Wang
Pet.apply(this, arguments); //结果: Wang
}
var dog = new Dog('Wang');
dog.speak();
(3)bind改变this
语法: 函数.bind(this);
该方法返回一个函数,是一个新的函数,
this.name="jack";
var demo={
name:"rose",
getName:function(){return this.name;}
}
console.log(demo.getName());//输出rose 这里的this指向demo
var another=demo.getName;
console.log(another())//输出jack 这里的this指向全局对象
//运用bind方法更改this指向
var another2=another.bind(demo);
console.log(another2());//输出rose 这里this指向了demo对象了;
区别:
1、apply,接受第二个参数是数组或伪数组,如果argArray不是一个有效数组或不是arguments对象,那么将导致一个TypeError
2、不同之处是call和apply是一次性改变this,bind是永久性改变this,可以认为bind的灵活性更高,你可以先把this绑定好, 然后什么时候想执行就什么时候执行。