继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

JavaScript中的this指针 理论化this指针的定义

慕容森
关注TA
已关注
手记 358
粉丝 183
获赞 649

JavaScript现在应用之广泛,远超其他任何语言,只要是一个合格的网站应用,基本上多多少少都会有JS的存在。在JavaScript中,this的指向被不少Coder所不解,但其实JS中的this理解起来也是相当容易的。在这里我也不能说直接一下个定义,就当做个介绍吧。



其实javascript里的this指针逻辑上的概念是实例化对象,这一点和java语言里的this指针是一致的,但是javascript里的this指针却比java里的this难以理解的多,究其根本原因我个人觉得有三个原因:

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

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

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

    ————以上内容摘自 https://www.cnblogs.com/zhoulujun/p/5338883.html

因为已经有前辈解释过这个问题,那我就不做赘述了。其实很多JavaScript入门进阶书籍都会介绍到this,只是很笼统不容易理解。


由于JavaScript是一种直译式脚本语言,也是一个函数式编程语言,this指针的指向是会随着作用域的改变不断发生变化的。

在JS里,我们直接使用this的话:

  1. console.log(this)    //window对象  

在全局作用域中,this就等于window对象,即使是全等于的判断也是成立的:


  1. console.log(this === window)    //true  

也正是因为这个全局作用域严重影响了我们对JS中this的理解。而JS中的全局作用域就是window对象,window对象就是实例化对象,这个实例化过程由JavaScript引擎实现。

那我们自己来实例化一个对象:


  1. var obj = new Object()  

  2. obj.name = "New Obj"  

  3. obj.func = function(){  

  4.   console.log(this)  

  5. }  

  6. obj.func()    //obj对象  

由于我们实例化了一个obj对象,那么this指针自然就指向了obj这个对象,如果在func方法里打印this.name,自然会输出“New Obj”。那跳出func方法直接打印this,指针就回到了全局作用域,重新指向了window对象。

那说到这里了,this基本上已经可以很形象化的理解为只要创建(实例化)一个新的对象,在这个新的作用域内this指针就会指向这个对象,也可以说成是绑定。

如果已经理解了以上的内容,那JavaScript里的call和apply操作符就不会影响你对this的理解了。

原文出处

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP