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

版权声明:原创文章转载请标明出处 https://blog.csdn.net/superwebmaster/article/details/80494161

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的话:

console.log(this)    //window对象

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

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

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

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

  var obj = new Object()
  obj.name = "New Obj"
  obj.func = function(){
    console.log(this)
  }
  obj.func()    //obj对象

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

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

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


俞圣磊

阅读更多

扫码向博主提问

石石石头哥哥

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • Web开发
  • Web前端
  • Golang
  • JavaScript
  • beego
去开通我的Chat快问

没有更多推荐了,返回首页