- 首先要明白,this指向是在创建函数上下文的时候创建的,也就是执行的时候。所以this永远都是指向调用它的那个对象。
-
对于用户自定义的方法,所有的函数调用都可以转换成apply或call的形式,具体规则如下:
obj.child.method(p1, p2) 等价于obj.child.method.call(obj.child, p1, p2)
- 非严格模式:
foo(p1,p2) 等价于 foo.call( window, p1, p2)
- 严格模式:
foo(p1,p2) 等价于 foo.call( undefined, p1, p2)
注:这里只是针对用户自定义的方法,如果是JS内置的全局方法,如setTimeout,不论是setTimeout()还是window.setTimeout()形式的调用,回调函数内部的this都会指向window
-
例如:
function fn() {
console.log(this);
}
fn(); // window对象
window.fn(); // window对象- 解析:在普通模式下,this指向undefined时会被转向window,所以第一个函数的this指向的是window,第二个函数不用多说很明显。
严格模式下,this指向undefined时不会转向window:
function fn() {
'use strict';
console.log(this);
}
fn(); // undefined, fn是调用者,独立调用,
window.fn(); // window, fn是调用者,被window所拥有
一些可能需要快速记忆一下的地方:
- setTimeout(fn,1000)中的fn中的this,永远都是指向window对象,无论是否严格模式。
- 回调函数中,this指向的是((调用该回调函数)的函数)的调用对象
- 例如:
$("button").click( fn ) // fn里如果有this,指向的是button的DOM对象
- 例如: