js中的this关键字和其他的面向对象语言中的this是不同的。
下面通过对java中this关键字和js中的this关键字的内存分析来说明他们之间的不同
一.内存分析
1. java中this关键字
this指的是当前对象(对象自身的引用)
this为什么存在于堆中?
this关键字在方法内部使用,表示对“调用方法的那个对象”的引用。所以既然this方法只能在方法内部使用,那么他表示的就是一个局部的含义,相当于一个局部变量。而局部变量是存放在内存中的栈中的,当那个方法执行完,this就消失了!但是与局部变量不同的是,在同一个类里面,每个方法里面都存在this!this就相当于对象的一个属性了,不管我们使用还是不使用,他总是存在的! 这也是this存在堆中的原因!
2. Js中this关键字
关键字 this 指向调用该方法的对象;用在对象的方法中。使用 this即可在任何多个地方重用同一个函数。
正如上图所示:this是Javascript语言的一个关键字它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用
经过和上面的对比可以得出一个结论,js中的this依存于方法只有当方法被调用的时候this才会起作用来决定指向的是谁!而java中的this却可以看成是对象自己的一个属性不依赖于方法,只要对象存在this就存在
二.Js中this的使用
Js中 this总是指向调用该方法的对象,那么就从方法为切入点来分析this的使用
1. 在window中定义function中使用this关键字
Method()的调用者是window.
对window有所理解的人应该知道,Javascript页面级的作用域为window,即缺省有名对象都相当于window的一个属性,如定义var a;相当于指定window.a属性,定义function b同样相当于指定window.b属性。所以Method()的调用相当于window.Method()调用,调用者为window,所以this==window返回true;
Obj.Method()调用者为Obj,所以this==Obj返回true;
2. 在一个对象中定义一个公有属性和方法中使用this关键字
这种定义方式只有一种调用方式,通过对象调用;
但是getP函数仅定义了一次,在不同的场合运行,显示了不同的运行结果,这是有this指针的变化所决定的。
Js中this处理机制:方法由谁调用,则this表示谁。
在obj1的getP方法中,obj1调用了此方法那么this就指向了obj1对象;
在obj2的getP方法中,obj2调用了此方法那么this就指向了obj2对象;并通过this指针引用到了两个对象都具有的属性p。
由this指针的性质,也可以更好的理解JavaScript中对象的本质:一个对象就是由一个或多个属性(方法)组成的集合。每个集合元素不是仅能属于一个集合,而是可以动态的属于多个集合。这样,一个方法(集合元素)由谁调用,this指针就指向谁。
3. 在构造函数中使用this关键字
做一个修改来表明在构造函数中使用的this不是全局对象