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脚本
Dec 12 Javascript
javascript 动态调整图片尺寸实现代码
Dec 28 Javascript
基于Asp.net与Javascript控制的日期控件
May 22 Javascript
js 一个关于图片onload加载的事
Nov 10 Javascript
JS操作CSS随机改变网页背景实现思路
Mar 10 Javascript
js获取元素外链样式的方法
Jan 27 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
May 20 jQuery
bootstrap 通过加减按钮实现输入框组功能
Nov 15 Javascript
JS非行间样式获取函数的实例代码
Jun 05 Javascript
在Vue methods中调用filters里的过滤器实例
Aug 30 Javascript
详解微信小程序与内嵌网页交互实现支付功能
Oct 22 Javascript
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
AM/FM收音机的安装与调试
2021/03/02 无线电
用js判断浏览器是否是IE的比较好的办法
2007/05/08 Javascript
JavaScript 学习笔记(五)
2009/12/31 Javascript
js类型检查实现代码
2010/10/29 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
javascript通过元素id和name直接取得元素的方法
2015/04/28 Javascript
jQuery+CSS实现的网页二级下滑菜单效果
2015/08/25 Javascript
JS实现仿FLASH效果的竖排导航代码
2015/09/15 Javascript
Vue.js每天必学之数据双向绑定
2016/09/05 Javascript
jquery.Jcrop结合JAVA后台实现图片裁剪上传实例
2016/11/05 Javascript
jquery封装插件时匿名函数形参和实参的写法解释
2017/02/14 Javascript
jQuery加密密码到cookie的实现代码
2017/04/18 jQuery
关于Ajax的原理以及代码封装详解
2017/09/08 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
关于layui表单中按钮自动提交的解决方法
2019/09/09 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
Python之eval()函数危险性浅析
2014/07/03 Python
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
Python实现KNN邻近算法
2021/01/28 Python
Python进度条实时显示处理进度的示例代码
2018/01/30 Python
Pycharm新手教程(只需要看这篇就够了)
2019/06/18 Python
通过python实现windows桌面截图代码实例
2020/01/17 Python
联想哥伦比亚网上商城:Lenovo Colombia
2017/01/10 全球购物
美国奢侈品购物平台:Orchard Mile
2018/05/02 全球购物
美国一站式电动和手动工具商店:International Tool
2020/11/26 全球购物
幼教毕业生自我鉴定
2014/01/12 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
党性教育心得体会
2014/09/03 职场文书
演讲比赛通讯稿
2015/07/18 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
分享Python异步爬取知乎热榜
2022/04/12 Python