`

JavaScript this

阅读更多

this是JavaScript中一个比较混乱的地方。其实理解JavaScript中的this也挺简单的
在ECMA 3th中有这样的一段描述
There is a this value associated with every active execution context. The this value depends on the caller and the type of code being executed and is determined when control enters the execution context. The this value associated with an execution context is immutable.
翻译中文为
对于每个执行上下文,都有一个 this 值与其相关联。在控制进入执行上下文时,根据调用
者和被执行代码的类型决定这个值。与执行上下文相关联的 this 值是非可变的。
这样我们可以看出关键字 this 总是指向调用该方法的对象。

注意:
(1)对于函数来说,用对象方式调用时,函数中的局部变量并未在对应对象中增加相应的属性(window例外,它会把定义的全局变量添加到window对象相对应得属性中),即函数的局部变量并未添加到prototype链中去。
(2)函数中未使用this访问的变量为局部变量,使用this访问的为对象的属性,属性并不等同局部变量。
示例

<script>
var test = "test";//statements 1
alert( window.test );//statements 2
alert( this.test )//statements 3
function getTest(){
  var gTest = "gTest";//statements 4
  alert( this.gTest );//statements 5
}
var obj=new getTest();//statements 6
alert( obj.gTest ); //statements 7
</script>

 

statements 2,3,5,7 的结果分别为 test,test,undefined,undefined
statements 6 构造时并未将函数局部变量添加到生成对象的gTest的属性中去。所以访问对象的属性gTest时提示未定义
statements 1 全局变量test,添加到window对象的test属性中,所以statements 2的结果为test
statements 3 this为window对象,所以statements 3的结果与statements 1一致

再看一个示例

<script>
function getTest(){
  alert( gTest );//statements 1
  var gTest = "gTest";//statements 2
  alert( this.gTest );//statements 3
  alert( gTest );//statements 4
}
getTest.prototype.gTest = "out";//statements 5
var obj= new getTest();//statements 6
alert( obj.gTest );//statements 7
</script>

 

statements 1,2,3,4,7 的结果为undefined,out,gTest,out
statements 5 添加属性至getTest方法的原型链中。
statements 6 构建对象时statements 1访问的非对象的属性,而是函数变量,但是函数变量并为定义。所以statements 1为undefined而对于statements 3中,对象this代表getTest构建的对象,

所以能访问到相应到原型链中gTest的值。statements 7就更不用说了。

不要将函数的局部变量与对象的属性相混,更不要将对象及函数作用域链相混。
上两个示例为题外话,下面通过示例说明 this 总是指向调用该方法的对象。           

示例 1

<script>
var test = "test";//statements 1
function getTest(  ){
 alert( this.test );//statements 2
 alert( window.test );//statements 3
}
getTest();//statements 4
</script>

 

示例中方法getTest()的调用对象为window,statements 2中的this代表window。
所以 statements 2与statements 3结果一致都为test
示例 2

<script>
var test = "test";//statements 1
function getTest(  ){
 var test = "getTest";//statements 2
 alert( this.test );//statements 3
 alert( window.test );//statements 4
 alert( test );//statements 5
}
getTest();//statements 6
</script>

 

statements 3,4,5 的值为test,test,getTest。statements 3的值并不为getTest,而为test
更加说明this总是指向调用对象即为window。

再看一个示例对于dom对象中的this

<input type="button" id="aButton" value="demo" />
<script type="text/javascript">
 var button = document.getElementById("aButton");//statements 1
 function demo() {    
  this.value = "test";//statements 2
  alert( button.value );//statements 3
 }
button.onclick= demo;//statements 4
alert( button.onclick );//statements 5
</script> 

 

statements 2,3 的结果为生成的随机数并且值一致。
这样可以看出this和button对象具有一致性,其实this代表的就是button对象。

可以参考Firefox脚本调试可以看到this对应的值

注意在dom中直接调用函数时,它所调用函数的对象为window
<input type="button" id="aButton" value="demo" onclick="demo()" />
<script type="text/javascript">
 var button = document.getElementById("aButton");//statements 1
 function demo() {   
  this.value = "test";//statements 2
  alert( window.value );//statements 3
 }
alert( button.onclick );//statements 4
</script>

statements 2,3 的结果为生成的随机数并且值一致。
这样可以看出this和window对象具有一致性,其实this代表的就是window对象。 

可以参考Firefox脚本调试可以看到this对应的值

总结:this 总是指向调用该方法的对象,它随执行的上下文环境而改变。

备注:可以使用call及apply函数动态的修改当前的this对象。

  • 大小: 43.3 KB
  • 大小: 45.7 KB
分享到:
评论

相关推荐

    Presentations-JavaScriptThis-源码.rar

    Presentations-JavaScriptThis-源码.rar

    javascript中this的指向问题总结

    JavaScript中this的指向还没搞明白?来这看看 你就懂啦~

    JavaScript this使用方法图解

    这篇文章主要介绍了JavaScript this使用方法图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本文我们介绍下js中this的用法。 由上图可得,默认this指向...

    JavaScript this keyword

    Study note on htis keyword in JavaScript

    Javascript this 函数深入详解

     本文对Javascript this函数进行详细介绍,及知识的总结整理,彻底明白js this 函数该如何使用。 this 代码函数调用时, .1直接调用函数则为this则指向window对象 .2类调用时候指向这个类 .3 方法.apply(obg) ;...

    JavaScript This指向问题详解

    这篇文章主要介绍了JavaScript This指向问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 各位小伙伴在面试中被面试官问道this指向问题一定不少吧,同时...

    JavaScript this绑定过程深入详解

    本文实例形式详细分析了JavaScript this绑定过程。分享给大家供大家参考,具体如下: 在理解this 的绑定过程之前,首先要理解调用位置:调用位置就是函数在代码中被调用的位置(而不是声明的位置)。只有仔细分析...

    javascript this详细介绍

    主要介绍了javascript this详细介绍的相关资料,需要的朋友可以参考下

    JavaScript this 深入理解

    直到昨天翻了一下《JavaScript王者归来》这本书才算对this有一个深刻的理解。 大至归结一下: 1. 函数调用者与所有者 JavaScript 中函数(function) 存在调用者 与 所有者这两个概念,调用者是指调用函数的对象,通常...

    非常好的javascript原理资源,分享出来.zip

    2.JavaScript this 3.JavaScript 闭包 4.JavaScript 事件 5.javascript 跨域 6.javascript 命名空间 Oject-Oriented 1.JavaScript Expressive 2. Interfaces 3.Introduction 4. Inheritance 5.AOP Jquery ...

    JavaScript this关键字指向常用情况解析

    主要介绍了JavaScript this关键字指向常用情况解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    javascript的基础语法,面向对象的实现和设计模式实现

    2.JavaScript this 3.JavaScript 闭包 4.JavaScript 事件 5.javascript 跨域 6.javascript 命名空间 Oject-Oriented 1.JavaScript Expressive 2. Interfaces 3.Introduction 4. Inheritance 5.AOP Jquery ...

    JavaScript高级-this绑定规则+箭头函数

    JavaScriptthis绑定规则以及箭头函数相关知识,以便于讨论学习

    JavaScript this指向相关原理及实例解析

    主要介绍了JavaScript this指向相关原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    js原生态函数中使用jQuery中的 $(this)无效的解决方法.docx

    js原生态函数中使用jQuery中的 $(this)无效的解决方法.docx

    JavaScript this 关键字

    JavaScript this 关键字 面向对象语言中 this 表示当前对象的一个引用。 但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。 在方法中,this 表示该方法所属的对象。 如果单独使用,this ...

Global site tag (gtag.js) - Google Analytics