开发者社区> 唐玄奘> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

JScript中的"this"关键字使用方式补充

简介:
+关注继续查看
  在"JavaScript中this关键字使用方法详解"一文中,我曾例举了在JavaScript和JScript中的8种this关键字的方式。这不又发现还有两种this关键字的使用方式当时没有说到,现补充说明一下。并且通过第一种this关键字使用的说明,能让我们更好的理解JavaScript作为Object-Based语言的本质。

    一种是和JavaScript类中的定义有关,我们知道当我们定义如下类的时候: 

None.giffunction JSClass()
None.gif{
None.gif}
None.gif
None.gifJSClass.prototype.m_Properties = 100;
None.gif
None.gifJSClass.prototype.ToString = function()
None.gif{
None.gif    alert(this.m_Properties);
None.gif}

    方法ToString中的this.m_Properties就是100,那么下面这种定义呢?

None.giffunction JSClass()
None.gif{
None.gif}
None.gif
None.gifJSClass.m_Properties = -100;
None.gif
None.gifJSClass.ToString()
None.gif{
None.gif    alert(this.m_Properties);
None.gif}
None.gif

    这时ToString中的这个this.m_Properties是啥?是-100emdgust.gif。一定吗?这个不一定了,这得看我们怎么调用这个ToString方法。

None.gifJSClass.ToString();
None.gifvar fun = JSClass.ToString();
None.giffun();

    这时的运行结果居然是:-100和undefined。真是郁闷哈,怎么才能运行fun得到-100呢?需要这样来为fun赋值:
 
None.gifvar fun = function() { JSClass.ToString(); }
None.giffun();

    呵呵,这样就是-100了。好像挺废话的,最终不还是调用的JSClass.ToString()吗?这个我们后面再说,看看把这两个JSClass合在一起是什么情况呢?

None.giffunction JSClass()
None.gif{
None.gif}
None.gif
None.gifJSClass.m_Properties = -100;
None.gifJSClass.prototype.m_Properties = 100;
None.gif
None.gifJSClass.ToString = function()
None.gif{
None.gif    alert(this.m_Properties);
None.gif}
None.gif
None.gifJSClass.prototype.ToString = function()
None.gif{
None.gif    alert(this.m_Properties);
None.gif}

    这两个ToString()方法,和里面的this关键字它们是什么关系呢?看下面的示例:

None.gifvar jsclass = new JSClass();
None.gifjsclass.ToString();
None.gifJSClass.ToString();

    结果为:100和-100。这里的jsclass实际上是JavaScript的语言机制,通过new关键字的说明来创建的一个新的实例。而JSClass是什么呢?他们本就是对象实例,只是长得像个函数,也像一个类的说明。对于this的问题,第一个jsclass.ToString()方法里的this是指新创建实例,而JSClass.ToString()方法里的this是值得JSClass这个对象实例。

    理解了这两个this指代的东西的不同本质,也就能更好的明白,为什么JavaScript叫做Object-Based的语言,而更加清楚它和Object-Oriented语言的本质区别。

    回头再说一下补充第二中this的使用方法,就是在使用eval方法的时候,这个时候的this是什么呢?看看:

None.gifalert(this === eval("this"));

    的结果是什么?是true!这是因为eval内代码被执行的作用域就是当前页面本身的说。


本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
web前端-JavaScript中的this指向
什么是this指向 解析器在调用函数每次都会向函数内部传递一个隐含的参数,这个隐含的参数就是this. this指向的是一个对象,这个对象我们称为函数执行的上下文对象。
6 0
一文看懂Javascript的this关键字(下)
一文看懂Javascript的this关键字(下)
17 0
一文看懂Javascript的this关键字(上)
一文看懂Javascript的this关键字(上)
21 0
什么是 Rxjs 的 subscription
什么是 Rxjs 的 subscription
39 0
Javascript 中的 this
当我们学习 Javascript 中的 this 时,非常容易陷入一种困境,一种似懂非懂的困境。在某些情况下,我们看了一些文章和解释,将其应用到一些简单的情况,发现,嗯,确实这么运作了。而在另一些更为复杂的情况下,我们发现又懵逼了,什么情况?这篇文章的目的,就是要完全搞懂并掌握 Javascript 中的 this。为什么我们很难完全掌握 this?在我看来,原因是 this 的解释太过抽象,在理
482 0
[译] Javascript 中多样的 this
本文讲的是[译] Javascript 中多样的 this,本文将尽量解释清楚 JavaScript 中最基础的部分之一:执行上下文(execution context)。如果你经常使用 JS 框架,那理解 this 更是锦上添花。但如果你想更加认真地对待编程的话,理解上下文无疑是非常重要的。
943 0
+关注
641
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载