js中,this 的指向是看this是谁调用的,而不是在哪里定义的。只定义而未调用,此时this的指向是未知的,只有调用后才能知道this的指向。
- 小括号()直接调用,无打点,this指向全局window;IIFE中的this自执行时同理,一定指向window
var a = 2;
var obj = {
a : 1,
foo : function(){
console.log(this.a);
}
}
var f = obj.foo;
f(); //2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 对象打点调用方法,this指向调用它的对象。
或数组枚举调用,this指向的是数组本身
//Object.fn()
var a = 2;
var obj = {
a : 1,
foo : function(){
console.log(this.a);
}
}
var f = obj.foo;
f(); //2
obj.foo(); //1
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
//Array[index](); 等同于数组对象直接打点调用函数
function foo(){
console.log(this.length);
}
var arr = [foo,2,3,4];
arr[0](); //4
- 1
- 2
- 3
- 4
- 5
- 6
- setInterval(obj.fun,1000);obj.fun中的this一定指向window。因为setInterval()相当于window.setInterval(),还是window调用
//让obj.fun中的this指向obj,需要写在function()中
setInterval(function(){
obj.fun();
},1000);
- 1
- 2
- 3
- 4
- 点击的dom事件中,点的是谁,在事件处理函数中this就指向谁。
因此在操作dom时,之前若使用了this,必须先备份this,var self=this;
以避免在处理函数中的this指向改变。 - call()和apply(),改变this指向。call/apply的括号中是谁,this的指向就是谁。
var a = {
s : 1,
fun : function(){
console.log(this.s)
}
}
var b = {
s : 2
}
a.fun.call(b);
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10