Javascript的this用法

一:javascript是一个函数编程语言,怪就怪在它也有this指针,说明这个函数编程语言也是面向对象的语言,说的具体点,javascript里的函数是一个高阶函数,编程语言里的高阶函数是可以作为对象传递的,同时javascript里的函数还有可以作为构造函数,这个构造函数可以创建实例化对象,结果导致方法执行时候this指针的指向会不断发生变化,很难控制。

二:javascript里的全局作用域对this指针有很大的影响,由上面java的例子我们看到,this指针只有在使用new操作符后才会生效,但是javascript里的this在没有进行new操作也会生效,这时候this往往会指向全局对象window。

三:javascript里call和apply操作符可以随意改变this指向,这看起来很灵活,但是这种不合常理的做法破坏了我们理解this指针的本意,同时也让写代码时候很难理解this的真正指向。

this都是指向实例化对象。

function既是函数又可以表示对象,function是函数时候还能当做构造函数,javascript的构造函数我常认为是把类和构造函数合二为一,当然在javascript语言规范里是没有类的概念,但是我这种理解可以作为构造函数和普通函数的一个区别,这样理解起来会更加容易些

如果在javascript语言里没有通过new(包括对象字面量定义)、call和apply改变函数的this指针,函数的this指针都是指向window的

情形一:传入的参数是函数的别名,那么函数的this就是指向window;

情形二:传入的参数是被new过的构造函数,那么this就是指向实例化的对象本身;

情形三:如果我们想把被传入的函数对象里this的指针指向外部字面量定义的对象,那么我们就是用apply和call


正文开始:

this是JavaScript语言的一个关键字。

它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function test(){  
  2.     this.x = 1;  
  3.   }  
随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则, 那就是this指的是,调用函数的那个对象

还有一种理解,当在函数中调用时,函数没有原型的话,只是纯粹一个函数的话,那么this就指向window。

下面分四种情况,详细讨论this的用法。

情况一 纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。

请看下面这段代码,它的运行结果是1

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function test(){  
  2.     this.x = 1;  
  3.     alert(this.x);  
  4.   }  
  5.   test(); // 1  
为了证明this就是全局对象,我对代码做一些改变

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var x = 1;  
  2.   function test(){  
  3.     alert(this.x);  
  4.   }  
  5.   test(); // 1  
运行结果还是1。再变一下:
[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var x = 1;  
  2.   function test(){  
  3.     this.x = 0;  
  4.   }  
  5.   test();  
  6.   alert(x); //0  

情况二:作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this就指这个上级对象。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function test(){  
  2.     alert(this.x);  
  3.   }  
  4.   var o = {};  
  5.   o.x = 1;  
  6.   o.m = test;  
  7.   o.m(); // 1  

情况三 作为构造函数调用

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function test(){  
  2.     this.x = 1;  
  3.   }  
  4.   var o = new test();  
  5.   alert(o.x); // 1  
运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var x = 2;  
  2.   function test(){  
  3.     this.x = 1;  
  4.   }  
  5.   var o = new test();  
  6.   alert(x); //2  
运行结果为2,表明全局变量x的值根本没变。

情况四 apply调用
apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。

[javascript]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. var x = 0;  
  2.   function test(){  
  3.     alert(this.x);  
  4.   }  
  5.   var o={};  
  6.   o.x = 1;  
  7.   o.m = test;  
  8.   o.m.apply(); //0  
apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为
o.m.apply(o); //1

运行结果就变成了1,证明了这时this代表的是对象o

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值