JS中的this变量的使用介绍 |
本文标签:JS,this JavaScript中this的使用 在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余 。 对于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 ); }; obj.y(); //弹出 100 checkThis(); //弹出 this is a property of window 这里为什么会弹出 this is a property of window,可能有些让人迷惑 。在JavaScript的变量作用域里有一条规则“全局变量都是window对象的属性” 。当执行checkThis() 时相当于window.checkThis(),因此,此时checkThis函数体内的this关键字的指向变成了window对象,而又因为window对象又一个x属性(thisis a property of window),所以会弹出 thisis a property of window 。 上面的两个示例都是比较容易理解的,因为只要判断出当前函数是作为哪个对象的方法调用(被哪个对象调用)的,就可以很容易的判断出当前this变量的指向 。 this.x 与apply()、call() 通过call和apply可以重新定义函数的执行环境,即this的指向,这对于一些应用当中是十分常用的 。 示例三:call() 复制代码 代码如下: function changeStyle( type , value ){ this.style[ type ] = value; } var one = document.getElementByIdx( 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.getElementByIdx( one ); changeStyle.apply( one , [fontSize , 100px ]); changeStyle(fontSize , 300px); //出现错误,原因同示例三 apply的用法和call大致相同,只有一点区别,apply只接受两个参数,第一个参数和call相同,第二个参数必须是一个数组,数组中的元素对应的就是函数的形参 。 无意义(诡异)的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 事件监听函数中的this 复制代码 代码如下: var one = document.getElementByIdx( one ); one.onclick = function(){ alert( this.innerHTML ); //this指向的是one元素,这点十分简单.. }; 注意:js中的全局变量都会动态添加到Window 的实例 window,作为其属性 。 this是js的一个关键字,随着函数使用场合不同,this的值会发生变化 。但是总有一个原则,那就是this指的是调用函数的那个对象 。 1、纯粹函数调用 。 复制代码 代码如下: function test() { this.x = 1; alert(x); } test(); 其实这里的this就是全局变量 。看下面的例子就能很好的理解其实this就是全局对象Global 。 复制代码 代码如下: var x = 1; function test() { alert(this.x); } test();//1 var x = 1; function test() { this.x = 0; } test(); alert(x);//0 2、作为方法调用,那么this就是指这个上级对象 。 复制代码 代码如下: function test() { alert(this.x); } var o = {}; o.x = 1; o.m = test; o.m(); //1 3、作为构造函数调用 。所谓构造函数,就是生成一个新的对象 。这时,这个this就是指这个对象 。 复制代码 代码如下: function test() { this.x = 1; } var o = new test(); alert(o.x);//1 4、apply调用 this指向的是apply中的第一个参数 。 复制代码 代码如下: var x = 0; function test() { alert(this.x); } var o = {}; o.x = 1; o.m = test; o.m.apply(); //0 o.m.apply(o);//1 当apply没有参数时,表示为全局对象 。所以值为0 。 |