今天去面试,再次被面试官要求解释一下this的用法。但是很遗憾,我对this的理解只局限与把它当成全局变量。因此,回来之后,决定亡羊补牢,搞清楚this的用法。
1.全局代码中的this
alert(this); //window
2.普通函数中的this
function test(){ this.x = 2; }; test(); alert(x); //全局变量x=2
这里this指向了全局对象,即window。在严格模式中,则是undefined。
为了证明是全局变量的x,将代码更改如下:
var x = 1; funcion test(){ alert(this.x) ; } test(); alert(x); //全局变量x=1
3.作为对象的方法调用
var name = "clever coder"; var person = { name : "foocoder", hello : function(sth){ console.log(this.name + " says " + sth); } } person.hello("hello world");
输出 foocoder says hello world。this指向person对象,即当前对象。
4.对于对象方法的内部函数
var name = "clever coder"; var person = { name : "foocoder", hello : function(sth){ var sayhello = function(sth) { console.log(this.name + " says " + sth); }; sayhello(sth); } } person.hello("hello world");//clever coder says hello world
在内部函数中,this没有按预想的绑定到外层函数对象上,而是绑定到了全局对象。这里普遍被认为是JavaScript语言的设计错误,因为没有人想让内部函数中的this指向全局对象。一般的处理方式是将this作为变量保存下来,一般约定为that或者self:
var name = "clever coder"; var person = { name : "foocoder", hello : function(sth){ var that = this; var sayhello = function(sth) { console.log(that.name + " says " + sth); }; sayhello(sth); } } person.hello("hello world");//foocoder says hello world
5.对于构造函数中的this
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就是指这个新对象。
function test(){ this.x = 1; } var o = new test(); alert(o.x); // 1
运行结果为1。为了表明这时this不是全局对象,对代码做一些改变:
var x = 2; function test(){ this.x = 1; } var o = new test(); alert(x); //2
运行结果为2,表明全局变量x的值根本没变。
5.apply的应用
apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。
var x = 0; function test(){ alert(this.x); } var o={}; o.x = 1; o.m = test; o.m.apply(); //0
apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为
o.m.apply(o); //1
运行结果就变成了1,证明了这时this代表的是对象o。