this指向规则
在函数运行的时候,this指向***最终*** 调用它的那个对象
普通函数下的this指向
var i = 1;
function poo(){
//这里的this是指向window,所以this.i 是1
console.log(this.i);//1
}
poo();`
上述函数调用的poo()其实是window.poo(),从这里可以看出poo函数的调用者是window,所以该函数的this指向是window。
tips:一般我们是不写前面的window的
对象方法里的this指向
var obj = {
name : "林大台",
age : 18,
sayHi : function(){
console.log(this.name);//林大台
}
}
obj.sayHi();
上述代码我们可以看到,sayHi的调用者是obj,所以sayHi中的this指向就是obj。
构造函数中的this指向
function People(){
console.log(this); //People {}
}
var people = new People();
构造函数的this指向始终是指向实例对象的。
通过事件绑定的函数
<button></button>
var btn = document.querySelector("button")
btn.click = function(){
console.log(this); //<button></button>
}
通过事件绑定的函数,this指向的是绑定事件的对象。
改变函数this指向的方法
1. call方法
function foo(a, b){
console.log(this); // 此时this指向的是obj
}
var obj = {
name : "hello world",
age : 18
};
foo.call( obj , 1, 2);
call是在函数调用时改变函数的this指向,函数调用时,call中的第一个参数是obj,此时函数的this已经被改变到了obj。
call中的其他参数的传递与普通函数是一致的,实参1,2按照顺序分贝被赋值给了形参中的a,b。
2. apply方法
function foo( a , b ){
console.log(this , a , b );
}
var obj = {
name : "hello world",
age : 18
};
foo.apply( obj , [ 2 , 3 ] );
applyl是在函数调用时改变函数的this指向,函数调用时,apply中的第一个参数是obj,此时函数的this已经被改变到了obj。
apply与call方法的不同之处在于apply方法中的第二个参数是一个数组,按照顺序,数组中的2被赋值给了a,3被赋值给了b。
3. bind方法
(1)bind方法返回一个新函数,bind方法使用后,使用call及apply不会改变函数的this指向
function foo(){
console.log(this)
}
// bind 返回一个新函数;
var poo = foo.bind( {name : "hello world"} );
foo(); // this指向:window;
poo(); // this指向: {name : "hello world"}
poo.call({name : "林大台"}) //this指向: {name : "hello world"}
(2) bind可以绑定参数,实参传递遵循bind优先传递原则
function foo( a , b , c ){
console.log( this , a , b , c); //{name : "hello world"} 1 2 3
}
var poo = foo.bind( {name : "hello world"} , 1 , 2 );
poo(3);