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`或`.zip`文件很可能是关于这个主题的一份详细讲解材料,包含了一些示例代码和演示。 1. **`this`的基本概念**: `this`在JavaScript中用于引用当前执行上下文的对象,它的...
在JavaScript中,`this`关键字是一个非常重要的概念,它用于引用当前上下文中的对象。`this`的值在运行时确定,并且根据函数被调用的方式而改变。下面我们将深入探讨`this`的使用方法。 1. **全局作用域与浏览器...
JavaScript中this的指向还没搞明白?来这看看 你就懂啦~
为了正确地使用$(this)对象,我们需要了解JavaScript中this关键字的使用规则,并且正确地使用变量来存储当前函数的this对象。 五、结语 在JavaScript开发中,使用jQuery的$(this)对象需要遵守JavaScript中this...
在这个名为"Presentations-JavaScriptThis"的资料包中,很显然,我们将探讨"this"在JavaScript中的各种用法和应用场景。 首先,我们要明白"this"的基本概念。在JavaScript中,"this"引用的是函数调用时的执行上下文...
Study note on htis keyword in JavaScript
本文对Javascript this函数进行详细介绍,及知识的总结整理,彻底明白js this 函数该如何使用。 this 代码函数调用时, .1直接调用函数则为this则指向window对象 .2类调用时候指向这个类 .3 方法.apply(obg) ;...
这篇文章主要介绍了JavaScript This指向问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 各位小伙伴在面试中被面试官问道this指向问题一定不少吧,同时...
本文将详细介绍JavaScript中一种常见的事件处理用法——onclick(this)。 首先,我们需要理解什么是onclick事件处理器。在HTML中,onclick是一个事件属性,用于指定当元素被点击时将调用的JavaScript代码。这个属性...
this.Response.Write("<script language='javascript'>window.close();</script>"); ``` 这段代码的功能是关闭当前打开的窗口。通常用于用户完成某个操作后自动关闭当前窗口的情形。 #### 关闭父窗口 ```...
JavaScript中的`this`关键字是语言的核心特性之一,用于在函数执行上下文中引用当前对象。它在JavaScript中的行为可能与其他面向对象的语言(如Java或C++)中的`this`有所不同,因此理解其工作原理至关重要。 首先...
### JavaScript在PDF文档中的使用指南 #### 一、引言 随着互联网技术的发展与进步,PDF文档因其良好的兼容性及可移植性而被广泛应用。在众多功能中,JavaScript的集成使得PDF文档具备了动态交互能力,极大地提升了...
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 ...
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 关键字 面向对象语言中 this 表示当前对象的一个引用。 但在 JavaScript 中 this 不是固定不变的,它会随着执行环境的改变而改变。 在方法中,this 表示该方法所属的对象。 如果单独使用,this ...
### 原生JavaScript实现加载更多效果 在现代Web开发中,“加载更多”是一种非常常见的交互方式,尤其是在数据量较大的情况下。本篇文章将基于提供的代码片段来深入解析如何使用原生JavaScript来实现“上拉加载更多...
JavaScript 中的 `this` 关键字是一个非常核心的概念,它的指向依赖于函数的调用方式,而非定义方式。理解 `this` 的指向对于编写可预测的 JavaScript 代码至关重要。 在全局作用域中,`this` 指向全局对象,对于...
JavaScript中的`this`关键字是一个非常重要的概念,它用于在函数执行时引用当前上下文的对象。在JavaScript中,`this`的绑定遵循四个主要规则:默认绑定、隐式绑定、显式绑定和new绑定。让我们逐一深入理解这些规则...
### 使用JavaScript编写的计算器知识点解析 #### 一、Array.prototype.remove方法实现 在该计算器代码中,`Array.prototype.remove` 方法被定义为一个数组原型的方法,用于移除数组中的某个指定索引位置的元素。 *...
本文将深入探讨JavaScript中`this`关键字的多种使用场景,并对比其他面向对象语言中的`this`。 首先,了解`this`在传统的面向对象编程语言中的用途。在C++、C#、Java等语言中,`this`关键字被用于指向当前对象的...