javascript中的this关键字
查了好多有关this的资料,this是Javascript语言的一个关键字。
它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,
- function test(){
- this.x = 1;
- }
随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。
情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。
请看下面这段代码,它的运行结果是1。
- function test(){
- this.x = 1;
- alert(this.x);
- }
- test(); // 1
情况二:作为对象方法的调用
函数还可以作为某个对象的方法调用,这时this就指这个上级对象。
- function test(){
- alert(this.x);
- }
- var o = {};
- o.x = 1;
- o.m = test;
- o.m(); // 1
情况三 作为构造函数调用
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。
- function test(){
- this.x = 1;
- }
- var o = new test();
- alert(o.x); // 1
情况四 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。
更多理解this的几个例子
如果是一个全局的function,则this相当于window对象,在function里定义的各种属性或者方法可以在function外部访问到,前提是这个function需要被调用。
- "text/javascript">
- //在function中使用this
- function a() {
- if (this == window) {
- alert("this == window");
- this.fieldA = "I'm a field";
- this.methodA = function() {
- alert("I'm a function ");
- }
- }
- }
- a(); //如果不调用a方法,则里面定义的属性会取不到
- alert(window.fieldA);
- methodA();
如果使用new的方式去实例化一个对象,则this不等于window对象,this指向function a的实例:
- "text/javascript">
- //在function中使用this
- function a() {
- if (this == window) {
- alert("this == window");
- this.fieldA = "I'm a field";
- this.methodA = function() {
- alert("I'm a function ");
- }
- }
- }
- a(); //如果不调用a方法,则里面定义的属性会取不到
- alert(window.fieldA);
- methodA();
使用prototype扩展方法可以使用this获取到源对象的实例,私有字段无法通过原型链获取:
- "text/javascript">
- //在function中使用this之三
- function a() {
- this.fieldA = "I'm a field";
- var privateFieldA = "I'm a var";
- }
- a.prototype.ExtendMethod = function(str) {
- alert(str + " : " + this.fieldA);
- alert(privateFieldA); //出错
- };
- var b = new a();
- b.ExtendMethod("From prototype");
不管是直接引用function,还是实例化一个function,其返回的闭包函数里的this都是指向window。
- "text/javascript">
- //在function中使用this之四
- function a() {
- alert(this == window);
- var that = this;
- var func = function() {
- alert(this == window);
- alert(that);
- };
- return func;
- }
- var b = a();
- b();
- var c = new a();
- c();
在HTML中使用this,一般代表该元素本身:
- <div onclick="test(this)" id="div">Click Me div>
- <script type="text/javascript">
- function test(obj) {
- alert(obj);
- }
- script>
- 在IE和火狐(Chrome)下注册事件,this分别指向window和元素本身:
- <div id="div">Click Me div>
- <script type="text/javascript">
- var div = document.getElementById("div");
- if (div.attachEvent) {
- div.attachEvent("onclick", function() {
- alert(this == window);
- var e = event;
- alert(e.srcElement == this);
- });
- }
- if (div.addEventListener) {
- div.addEventListener("click", function(e) {
- alert(this == window);
- ee = e;
- alert(e.target == this);
- }, false);
- }
- script>
用户登录
还没有账号?
立即注册