作为前端程序员,this应该不会陌生,指执行期的上下文,以下总结了this的几种场景:
1、全局作用域下,this指的就是Window,在控制台输出this,返回的是Window对象
2、在一般函数中,this也是指代Window
function f(){ console.log(this); }
f();
输出的依旧是Window对象
3、定义一个对象,在对象中定义成员函数,通过对象的形式调用函数时,this指代的就是这个对象,谁调用函数,this指代的就是谁。和情况2原理一样,f函数定义在全局作用域下,f() = window.f(),所以指向window
var obj = {
f:function(){ console.log(this); } }; obj.f();//输出obj var obj2 = obj.f; obj2();// =window.obj2();输出Window对象
4、在new的构造函数中,this指向正在创建的对象
function FF(){ console.log(this);//输出FF } var a = new FF();
5、我们说this要么是window,要么是调用函数的对象,那么this能否被改变呢?答案是可以的,call/apply,就可以改变this的指向,两者的相同点是第一个参数是被指向的对象,后面参数是函数执行所需要的参数,不同的地方是,call第一个参数之后的其他参数,依此往后排,逗号隔开,而apply后面的参数放在一个数组里,放在第二参数的位置,具体用法如下:
var obj = { f:function(){ console.log(this); } }; var obj2 = obj.f; obj.f();//输出obj var objnew = {}; obj2.call(objnew, 参数1, 参数2, ....);//输出objnew obj2.apply(objnew, [参数1, 参数2...]);//输出objnew
上面是对this的总结,应该可以在大部分情况下判断this指向的是谁了