this对象是在运行时基于函数的执行环境绑定的。
在全局函数中,this等于window;当函数别作为某个对象的方法调用时,this等于该对象。
this的几个常用方法:
1、全局性调用
此时this对象此时代表全局对象global。示例如下:
var x=1;
function getValue(){
alert(this.x);
}
getValue();//1
如果此时this不是等于global则找不到this.x的值。
var x=1;
function getValue(){
this.x=2;
}
getValue();
alert(this.x);//2
如果此时this不是等于global,则结果应该为1.
2、 作为对象方法调用
this等于该对象。示例如下:
var x=1;
function getValue(){
alert(this.x);
}
var o={};
o.x=2;
o.method=getValue;
o.method();//2
3、 作为构造函数调用
此时this等于该构造函数生成的新对象。【构造函数:通过这个函数生成一个新对象】,示例如下:
var x=1;
function setValue(){
this.x=2;
}
var o=new setValue();
alert(o.x);//2
4、 apply调用和call调用
apply()是函数对象的一个方法,作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。this指的是第一个参数。实例如下:
var x=1;
function getValue(){
alert(this.x);
}
var o={};
o.x=2;
o.method=getValue;
o.method.apply();//1
o.method.apply(o);//2
当apply()的第一个参数为空时,默认调用全局对象,此时this等于global。当apply()的第一个参数为o时,this指向这个第一个参数o。
call()也是函数对象的一个方法,也可以改变函数的调用对象。【和apply()的区别在于call()是调用一个对象的方法,apply()是应用某一对象的方法】它的第一个参数就表示改变后的调用这个函数的对象。this指的是第一个参数。如果没有第一个参数,则默认为global。实例如下:
var x=1;
function getValue(){
alert(this.x);
}
var o={};
o.x=2;
o.method=getValue;
o.method.call();//1
o.method.call(o);//2
当call()的第一个参数为空时,默认调用全局对象,此时this等于global。当call()的第一个参数为o时,this指向这个第一个参数o。
匿名函数的执行环境具有全局性,因此其this对象通常指向window
先看个例子:
var name="the window";
var object={
name:" my object",
getNameFunc:function(){
return function(){
return this.name;
}
}
};
alert(object.getNameFunc()());//the window
匿名函数中,提供给该函数执行环境关联的this的值实际上时null,但在ES3下,这种情况下的都把global当做this。
关于this为什么指向window,一开始有点疑问,后于知乎上找到答案。此处附上知乎地址:http://www.zhihu.com/question/21958425
参考自阮一峰《Javascript的this用法》http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html
参考《javascript高级程序(第三版)》
参考http://www.zhihu.com/question/21958425