在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。
1. 一般用处
对于this变量最要的是能够理清this所引用的对象到底是哪一个,也许很多资料上都有自己的解释,但有些概念讲的偏繁杂。而我的理解是:首先分析this所在的函数是当做哪个对象的方法调用的,则该对象就是this所引用的对象。
示例一
var obj = {};
obj.x = 100;
obj.y = function() { alert( this.x ); };
obj.y(); //弹出 100
这段代码非常容易理解,当执行 obj.y() 时,函数是作为对象obj的方法调用的,因此函数体内的this指向的是obj对象,所以会弹出100。
示例二
var checkThis = function() {
alert( this.x);
};
var x = 'this is a property of window';
var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };
var obj2 = oby.y;
obj.y(); //弹出 100
checkThis(); //弹出 'this is a property of window
obj2(); //弹出 'this is a property of window
这里为什么会弹出 'this is a property of window',可能有些让人迷惑。在JavaScript的变量作用域里有一条规则“全局变量都是window对象的属性”。当执行 checkThis() 时相当于 window.checkThis(),因此,此时checkThis函数体内的this关键字的指向变成了window对象,而又因为window对象又一个x属性( 'this is a property of window'),所以会弹出 'this is a property of window'。
上面的两个示例都是比较容易理解的,因为只要判断出当前函数是作为哪个对象的方法调用(被哪个对象调用)的,就可以很容易的判断出当前this变量的指向。
2. this.x 与 apply()、call()
通过call和apply可以重新定义函数的执行环境,即this的指向,这对于一些应用当中是十分常用的。
示例三:call()
function changeStyle( type , value ){
this.style[ type ] = value;
}
var one = document.getElementById( 'one' );
changeStyle.call( one , 'fontSize' , '100px' );
changeStyle('fontSize' , '300px'); //出现错误,因为此时changeStyle中this引用的是window对象,而window并无style属性。
注意changeStyle.call() 中有三个参数,第一个参数用于指定该函数将被哪个对象所调用。这里指定了one,也就意味着,changeStyle函数将被one调用,因此函数体内this指向是one对象。而第二个和第三个参数对应的是changeStyle函数里的type和value两个形参。最总我们看到的效果是Dom元素one的字体变成了20px。
示例四:apply()
function changeStyle( type , value ){
this.style[ type ] = value;
}
var one = document.getElementById( 'one' );
changeStyle.apply( one , ['fontSize' , '100px' ]);
changeStyle('fontSize' , '300px'); //出现错误,原因同示例三
apply的用法和call大致相同,只有一点区别,apply只接受两个参数,第一个参数和call相同,第二个参数必须是一个数组,数组中的元素对应的就是函数的形参。
3. 无意义(诡异)的this用处
示例五
var obj = {
x : 100,
y : function(){
setTimeout(
function(){ alert(this.x); } //这里的this指向的是window对象,并不是我们期待的obj,所以会弹出undefined
, 2000);
}
};
obj.y();
如何达到预期的效果
var obj = {
x : 100,
y : function(){
var that = this;
setTimeout(
function(){ alert(that.x); }
, 2000);
}
};
obj.y(); //弹出100
4. 事件监听函数中的this
var one = document.getElementById( 'one' );
one.onclick = function(){
alert( this.innerHTML ); //this指向的是one元素,这点十分简单..
};
5. 总结
以上可以归纳为:“this所指的就是直至包含this指针的上层对象”
调用形式
this指向
普通函数 |
全局对象window |
对象的方法 |
该对象 |
构造函数 |
新构造的对象 |
相关推荐
在本文中,我们将深入探讨`this`在JavaScript中的工作原理,以及在不同场景下的用法。 1. **函数调用方式** 在函数调用中,`this`的值取决于函数被调用的方式。如果函数是作为对象的方法调用,`this`将指向调用该...
总结起来,理解JavaScript中的`this`关键字至关重要,因为它在不同情境下有不同的行为。在编写代码时,正确地理解和使用`this`可以帮助我们更好地控制代码的执行环境,避免安全问题,比如避免意外修改全局变量,确保...
JavaScript中的`this`关键字是一个非常核心的概念,它用于在函数执行时引用当前上下文的对象。在JavaScript中,`this`的值取决于函数被调用的方式,而不是函数定义的位置。理解`this`的工作原理对于深入掌握...
在编写复杂的JavaScript代码时,深入理解`this`的工作原理能够避免许多常见的错误和混淆,提高代码的准确性和可维护性。 在实际开发中,`this`的应用场景非常广泛,例如事件处理、回调函数、模块封装、面向对象编程...
总之,深入理解JavaScript中的this关键字是提高编程技能不可或缺的一部分。通过掌握this在不同上下文中的行为和如何正确地控制this的绑定,开发者可以更有效地使用JavaScript编写出更加结构化和可重用的代码。
以下几点可以帮助我们深入理解this在JavaScript中的行为: 1. 在全局执行环境中(在任何函数体外部),this指向全局对象。在浏览器环境中,全局对象是window。 2. 在函数内部,this的值取决于函数是如何被调用的。...
总之,理解JavaScript中的this关键字需要对执行上下文、函数调用方式、以及函数如何被定义和使用有深入的认识。通过本文对this关键字的分析,我们可以得到一个更加清晰和全面的理解,并在实际开发中更加自如地运用。
通过以上分析我们可以看到,JavaScript中的this关键字行为虽然有些复杂,但只要我们深入理解它的绑定规则,合理利用bind方法和高阶函数等特性,就可以更好地控制函数的执行上下文,从而写出更加优雅和高效的代码。
下面我们将通过一系列实例来深入理解`this`的关键字用法。 首先,我们来看一个基本的例子: 例1: ```javascript function a() { var user = "yao"; console.log(this.user); // undefined console.log(this); ...
在JavaScript编程中,`this`关键字是一个至关重要的概念,它在不同的执行环境中有着不同的指向。在浏览器环境和Node.js环境中,`this`的行为差异主要源于它们的执行上下文。让我们深入探讨这个问题。 首先,让我们...
总结来说,`this`关键字在JavaScript中扮演着至关重要的角色,它的值根据执行上下文动态确定,这使得JavaScript的函数更加灵活,但也增加了理解和调试的复杂性。理解`this`的工作原理对于深入掌握JavaScript至关重要...
理解JavaScript中的`this`关键字对于编写高质量的代码至关重要。`this`的指向取决于函数调用的上下文,它可以是全局对象、对象方法的调用者、通过`new`创建的对象,或者通过`call`和`apply`显式指定的对象。熟悉这些...
总之,理解 `this` 关键字以及如何在 JavaScript 中实现类和继承对于任何前端开发者来说都是非常重要的技能。随着 JavaScript 生态系统的不断发展,这些基础知识将继续成为构建复杂应用的基础。
深入理解`this`的用法是JavaScript编程的关键部分。根据标题和描述,本文将探讨`this`在不同场景下的指向。 首先,当一个函数在全局作用域中定义时,`this`默认指向全局对象,而在浏览器环境中,全局对象通常是`...
`this`是JavaScript中一个非常重要的关键字,它用于表示函数执行时上下文的对象。`this`的值在函数被调用的不同方式下会发生变化,这使得理解和掌握`this`的...在编写复杂的应用程序时,对`this`的深入理解至关重要。