这篇文章主要介绍Javascript中这的一些用法示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
<强> 1.1.1摘要强>
相信有C/c++, c#或Java等编程经验的各位,对于 这关键字再熟悉不过了。由于Javascript是一种面向对象的编程语言,它和C/c++, c#或Java一样都包含 这关键字。
<强> 1.1.2
正文强>
由于许多面向对象的编程语言都包含 这关键字,我们会很自然地把这个和面向对象的编程方式联系在一起,这 通常指向利用构造器新创建出来的对象。而在ECMAScript中,这 不仅仅只用来表示创建出来的对象,也是执行上下文的一个属性:
activeExecutionContext =, {//Variable 对象。 签证官:,{…}, :thisValue };
<>强全局代码中的这 强>
//,Global 范围//,,implicit property  of //,,global 对象 时间=foo1 “abc"; 警报(foo1);//, abc//,,explicit property  of //,,global 对象 时间=this.foo2 “def"; 警报(foo2);//, def//,,implicit property  of //,,global 对象 var foo3 =,“ijk"; 警报(foo3);,//, ijk
前面我们通过显式和隐式定义了全局属性foo1, foo2和foo3,由于这 在全局上下文中,所以它的值是全局对象本身(在浏览器中是窗口
对象);接下来我们将介绍函数中的 。
<强>函数中的这 强>
当这 在函数代码中,情况就复杂多了,并且会引发很多的问题。
函数代码中这 值的第一个特性(同时也是最主要的特性)就是:<强>它并非静态的绑定在函数上强>。
正如此前提到的,这 的值是在进入执行上下文(承办
上下文)的阶段确定的,并且在函数代码中的话,其值每次都不尽相同。
然而,一旦进入执行代码阶段,其值就不能改变了。如果要想给这 赋一个新的值是不可能的,因为在那时这 根本就不是变量了。
接下来,我们通过具体的例子说明函数中的 。
首先我们定义两个对象foo和人,foo包含一个属性的名字,而人包含属性名称和方法()说,具体的定义如下:
//,Defines foo 对象。 var foo =, { 名称:,“Foo" };//,Defines person 对象。 var person =, { 名称:,“JK_Rush", 说:,()函数,{ 警报(却;能够===,人); alert (“My  name is “, +, this.name); } }; person.say ();,//, My name is JK_Rush//,foo 以及person object refer 过多;//,,same function 说 时间=foo.say person.say; foo.say ();,//, My name is Foo。
通过上面的代码,我们发现调用人的说()方法时,这 指向人对象,当通过赋值方式使得Foo的说()方法指向伤中的说()方法时。我们调用Foo()说的方法,发现 不这是指向人对象,而不是指向Foo对象,这究竟是什么原因呢?
首先,我们必须知道这 的值在函数中是非静态的,它的值确定在函数调用时,具体代码执行前,<强> 这 强>的值是由激活上下文代码的调用者决定的,比如说,调用函数的外层上下文,更重要的是,<强> 这 强> <强>的值是由调用表达式的形式决定的>强,所以说<强> 这 强> <强>并非静态的绑定在函数上强>。
由于这 并非静态地绑定在函数上,那么我们是否可以在函数中动态地修改这 的值呢?
//,Defines foo 对象。 var foo =, { 名称:,“Foo" };//,Defines person 对象。 var person =, { 名称:,“JK_Rush", 说:,()函数,{ 警报(却;能够===,人); 却,能够=,foo,,//ReferenceError alert (“My  name is “, +, this.name); } }; person.say ();,//, My name is JK_Rush
现在我们在方法()中说,动态地修改这 的值,当我们重新执行以上代码,发现这 的值引用错误。这是由于一旦进入执行代码阶段(函数调用时,具体代码执行前),这 的值就确定了,所以不能改变了。
<强>引用类型强>
前面我们提到这 的值是由激活上下文代码的调用者决定的,更重要的是,这