js中this的使用案例整理

来源:互联网 发布:阿里云后端框架 编辑:程序博客网 时间:2024/06/15 09:55

在前台js的使用过程中,除了常用的标签或者选择器外,this的作用也是不容忽视的。this可以实现在方法内或者在函数内取值或指向,这是一般的标签或选择器不易做到的。下面就是我在工作和学习中,有些是自己整理,有些人转载别人的文章。对js中的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的指向,这对于一些应用当中是十分常用的。 


案例三、

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。


案例四:

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 
注意:js中的全局变量都会动态添加到Window 的实例 window,作为其属性。 


this是js的一个关键字,随着函数使用场合不同,this的值会发生变化。但是总有一个原则,那就是this指的是调用函数的那个对象。


纯粹的函数调用:

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 
作为方法调用,那么this就是指这个上级对象。 

function test() { alert(this.x); } var o = {}; o.x = 1; o.m = test; o.m(); //1 
作为构造函数调用。所谓构造函数,就是生成一个新的对象。这时,这个this就是指这个对象。

function test() { this.x = 1; } var o = new test(); alert(o.x);//1 
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 








原创粉丝点击