this的使用环境有以下几种
1、全局性函数调用
我们通常在全局内声明和调用的函数都叫全局函数。在全局函数中,this等于window。
例如下面一段代码中,运行结果应该是0。因为this调用的是全局变量,等同于window。
var x = 1; function test() { this.x = 0; console.log(this.x); //0 } test();
2、作为对象方法的调用
所谓对象方法,指的是对象中值为函数的属性。当函数不是全局调用,而是作为某个对象的方法调用时,this等于那个对象。
例如下面这段代码,func是作为对象o的方法,所以func的调用中this指向对象o。
var x = 1; function test() { console.log(this.x); } var o = {}; o.x = 0; o.func = test; o.func(); //0
3、作为匿名函数被返回的时候
匿名函数的执行环境具有全局性,因此其this对象通常指向window。
例如下面这段代码,由于getNameFunc返回的是一个匿名函数,所以返回函数的this指向window。
var name = "The Window"; var object = { name: "My Object", getNameFunc: function() { return function() { return this.name; } } }; console.log(object.getNameFunc()()); //"The Window"
4、作为构造函数的调用
所谓构造函数,就是通过对这个函数使用new操作符来生成一个新对象,而this就是指这个新对象。
例如下面这段代码,由于func是使用new操作符来构造的一个对象,所以this指func这个对象。
var x=1; function func(){ this.x=2; } var func=new func(); console.log(func.x);//2
console.log(x);//1
5、使用apply调用函数的时候
使用function.apply(obj,args)调用函数的时候,可以接受两个参数obj和args,其中obj用来代替function类里的this对象,所以此时函数内的this指的是apply的第一个参数。
例如下面这段代码,如果apply没有参数,则默认调用全局对象,因此这时的运行结果为1,证明this指的是全局对象。如果apply有参数,则this指向的是第一个参数所指的对像。
var x = 1; function test() { console.log(this.x); } var o = {}; o.x = 2; o.func = test; o.func.apply(); //1 o.func.apply(o); //2
随着函数使用场合的不同,this的值会发生变化,但是有一个总的原则,那就是this指的是调用函数的那个对象。