this 是什么?
this是指包含它的函数在被方法调用时所指的对象。就是谁调用了我,我就是谁的对象,谁最后调用了我,我就是谁的对象。记住一下三点。
-
包含它的函数
-
作为方法被调用时
-
所属的对象
this 的使用方法
function showName(){
console.log(this); //window
}
showName();
因为test()函数是在全局中被window对象所调用的,那么this久理所当然的是指向window对象了,可是 name变量是定义在testFun函数里面的,window对象中并没有定义name变量,当然也就不会打印出"hello this"这个字符串了。
var name = "hey";
function testFun() {
var name = "hello this!";
console.log(this.name);
}
testFun();
此时定义了一个全局变量name,即在window对象上定义了name,这里的this指向函数function的对象,即window,所以this.name为window.name因此会打印出"hey"字符串来。
var obj={
a:"哈哈哈",
b:function(){
var a="嘿嘿嘿";
console.log(this.a);
}
};
obj.b();
this被包含在函数b()中,但是因为是被对象obj所调用的,因此this属于对象obj,所以会打印出字符串"哈哈哈";
var obj = {
a:10,
b:{
fn:function(){
console.log(this.a); //undefined
}
}
};
obj.b.fn();
在这个例子中对象obj是在window上面定义的,所以obj.b.fn()=window.obj.b.fn(),那么大家会说this不是被window对象,或者被b调用了吗,请注意此时this最后是被fn锁调用的,所以this属于函数fn,因为在函数fn中并没有定义变量a,所以会打印出undefined;
总结
1. this指向的,永远只可能是对象!
2. this指向谁,永远不取决于this写在哪!而是取决于函数在哪调用。
3. this指向的对象,我们称之为函数的上下文context,也叫函数的调用者。
4. this的调用方法
- 通过函数名()直接调用:this指向window
function func(){
console.log(this);
}
//① 通过函数名()直接调用:this指向window
func(); // this--->window
- 通过对象.函数名()调用的:this指向这个对象
function func(){
console.log(this);
}
//② 通过对象.函数名()调用的:this指向这个对象
// 狭义对象
var obj = {
name:"obj",
func1 :func
};
obj.func1(); // this--->obj
// 广义对象
document.getElementById("div").onclick = function(){
this.style.backgroundColor = "red";
}; // this--->div
- 函数作为数组的一个元素,通过数组下标调用的:this指向这个数组
function func(){
console.log(this);
}
//③ 函数作为数组的一个元素,通过数组下标调用的:this指向这个数组
var arr = [func,1,2,3];
arr[0](); // this--->arr
- 函数作为window内置函数的回调函数调用:this指向window( setInterval setTimeout 等)
function func(){
console.log(this);
}
//④ 函数作为window内置函数的回调函数调用:this指向window
setTimeout(func,1000);// this--->window
//setInterval(func,1000);