`
cppmule
  • 浏览: 447210 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

深入理解JavaScript中的this关键字

 
阅读更多

深入理解JavaScript中的this关键字

在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
对象的方法 该对象
构造函数 新构造的对象
分享到:
评论

相关推荐

    JavaScript中this关键字使用方法详解

    在本文中,我们将深入探讨`this`在JavaScript中的工作原理,以及在不同场景下的用法。 1. **函数调用方式** 在函数调用中,`this`的值取决于函数被调用的方式。如果函数是作为对象的方法调用,`this`将指向调用该...

    详解JavaScript中this关键字的用法_.docx

    总结起来,理解JavaScript中的`this`关键字至关重要,因为它在不同情境下有不同的行为。在编写代码时,正确地理解和使用`this`可以帮助我们更好地控制代码的执行环境,避免安全问题,比如避免意外修改全局变量,确保...

    深入解析JavaScript编程中的this关键字使用

    JavaScript中的`this`关键字是一个非常核心的概念,它用于在函数执行时引用当前上下文的对象。在JavaScript中,`this`的值取决于函数被调用的方式,而不是函数定义的位置。理解`this`的工作原理对于深入掌握...

    精通JavaScript的this关键字_.docx

    在编写复杂的JavaScript代码时,深入理解`this`的工作原理能够避免许多常见的错误和混淆,提高代码的准确性和可维护性。 在实际开发中,`this`的应用场景非常广泛,例如事件处理、回调函数、模块封装、面向对象编程...

    深入理解Javascript中的this关键字

    总之,深入理解JavaScript中的this关键字是提高编程技能不可或缺的一部分。通过掌握this在不同上下文中的行为和如何正确地控制this的绑定,开发者可以更有效地使用JavaScript编写出更加结构化和可重用的代码。

    关于javascript中this关键字(翻译+自我理解)

    以下几点可以帮助我们深入理解this在JavaScript中的行为: 1. 在全局执行环境中(在任何函数体外部),this指向全局对象。在浏览器环境中,全局对象是window。 2. 在函数内部,this的值取决于函数是如何被调用的。...

    深入理解JavaScript系列(13) This? Yes,this!

    总之,理解JavaScript中的this关键字需要对执行上下文、函数调用方式、以及函数如何被定义和使用有深入的认识。通过本文对this关键字的分析,我们可以得到一个更加清晰和全面的理解,并在实际开发中更加自如地运用。

    Javascript中this关键字的一些小知识

    通过以上分析我们可以看到,JavaScript中的this关键字行为虽然有些复杂,但只要我们深入理解它的绑定规则,合理利用bind方法和高阶函数等特性,就可以更好地控制函数的执行上下文,从而写出更加优雅和高效的代码。

    JavaScript中this关键字用法实例分析

    下面我们将通过一系列实例来深入理解`this`的关键字用法。 首先,我们来看一个基本的例子: 例1: ```javascript function a() { var user = "yao"; console.log(this.user); // undefined console.log(this); ...

    【JavaScript源代码】NodeJS和浏览器中this关键字的不同之处.docx

    在JavaScript编程中,`this`关键字是一个至关重要的概念,它在不同的执行环境中有着不同的指向。在浏览器环境和Node.js环境中,`this`的行为差异主要源于它们的执行上下文。让我们深入探讨这个问题。 首先,让我们...

    javascript的this关键字详解

    总结来说,`this`关键字在JavaScript中扮演着至关重要的角色,它的值根据执行上下文动态确定,这使得JavaScript的函数更加灵活,但也增加了理解和调试的复杂性。理解`this`的工作原理对于深入掌握JavaScript至关重要...

    Javascript中this关键字指向问题的测试与详解

    理解JavaScript中的`this`关键字对于编写高质量的代码至关重要。`this`的指向取决于函数调用的上下文,它可以是全局对象、对象方法的调用者、通过`new`创建的对象,或者通过`call`和`apply`显式指定的对象。熟悉这些...

    js this关键字_面向对象编程.pdf

    总之,理解 `this` 关键字以及如何在 JavaScript 中实现类和继承对于任何前端开发者来说都是非常重要的技能。随着 JavaScript 生态系统的不断发展,这些基础知识将继续成为构建复杂应用的基础。

    Javascript之this关键字深入解析

    深入理解`this`的用法是JavaScript编程的关键部分。根据标题和描述,本文将探讨`this`在不同场景下的指向。 首先,当一个函数在全局作用域中定义时,`this`默认指向全局对象,而在浏览器环境中,全局对象通常是`...

    详解JavaScript中this关键字的用法

    `this`是JavaScript中一个非常重要的关键字,它用于表示函数执行时上下文的对象。`this`的值在函数被调用的不同方式下会发生变化,这使得理解和掌握`this`的...在编写复杂的应用程序时,对`this`的深入理解至关重要。

Global site tag (gtag.js) - Google Analytics