JS中的this变量的使用介绍


Posted in Javascript onOctober 21, 2013

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。
Javascript 相关文章推荐
自己的js工具 Cookie 封装
Aug 21 Javascript
Mootools 1.2教程 定时器和哈希简介
Sep 15 Javascript
使用IE6看老赵的博客 jQuery初探
Jan 17 Javascript
Javascript 中的 call 和 apply使用介绍
Feb 22 Javascript
JS命名空间的另一种实现
Aug 09 Javascript
使用Sticker.js实现贴纸效果
Jan 28 Javascript
js实现文字在按钮上滚动的方法
Aug 20 Javascript
jQuery实现给input绑定回车事件的方法
Feb 09 Javascript
svg动画之动态描边效果
Feb 22 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
May 21 Javascript
js屏蔽F12审查元素,禁止修改页面代码等实现代码
Oct 02 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 Vue.js
JS对select控件option选项的增删改查示例代码
Oct 21 #Javascript
js传参数受特殊字符影响错误的解决方法
Oct 21 #Javascript
使用JavaScript修改浏览器URL地址栏的实现代码
Oct 21 #Javascript
JS操作Cookie写入和读取实例代码
Oct 20 #Javascript
在javaScript中关于submit和button的区别介绍
Oct 20 #Javascript
jQuery实现鼠标移到元素上动态提示消息框效果
Oct 20 #Javascript
图片动画横条广告带上下滚动可自定义图片、链接等等
Oct 20 #Javascript
You might like
php给每个段落添加空格的方法
2015/03/20 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
基于Jquery实现的一个图片滚动切换
2012/06/21 Javascript
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
Node.js和PHP根据ip获取地理位置的方法
2014/03/14 Javascript
JavaScript中return false的用法
2015/03/12 Javascript
JS动态改变表格边框宽度的方法
2015/03/31 Javascript
JavaScript 匿名函数和闭包介绍
2015/04/13 Javascript
解决jquery插件:TypeError:$.browser is undefined报错的方法
2015/11/21 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
node app 打包工具pkg的具体使用
2019/01/17 Javascript
JS如何实现动态添加的元素绑定事件
2019/11/12 Javascript
学习python中matplotlib绘图设置坐标轴刻度、文本
2018/02/07 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
python中使用 xlwt 操作excel的常见方法与问题
2019/01/13 Python
HTML5 拖拽批量上传文件的示例代码
2018/03/28 HTML / CSS
canvas学习总结三之绘制路径-线段
2019/01/31 HTML / CSS
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
DataList 能否分页,请问如何实现?
2015/05/03 面试题
什么是测试驱动开发(TDD)
2012/02/15 面试题
优秀员工自荐书
2013/12/19 职场文书
列车长先进事迹材料
2014/01/25 职场文书
《只有一个地球》教学反思
2014/02/14 职场文书
党员领导干部廉洁从政承诺书
2014/03/27 职场文书
市场部经理岗位职责
2014/04/10 职场文书
房产电话营销开场白
2015/05/29 职场文书
保留意见审计报告
2015/06/05 职场文书
建房合同协议书
2016/03/21 职场文书
Java网络编程之UDP实现原理解析
2021/09/04 Java/Android