JavaScript中的this指针 理论化this指针的定义
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的理解了。
共同学习,写下你的评论
评论加载中...
作者其他优质文章