JavaScript中的this引用(推荐)


Posted in Javascript onAugust 05, 2016

this

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

一、定义

1、this是函数内部的一个特殊对象(或this引用)--它引用的是函数据以执行的环境对象。

2、this引用是一种在JavaScript的代码中随时都可以使用的只读变量。 this引用 引用(指向)的是一个对象,它有着会根据代码上下文语境自动改变其引用对象的特性。它的引用规则如下:

• 在最外层代码中,this引用 引用的是全局对象。

• 在函数内,this引用根据函数调用的方式的不同而有所不同。如下

1)构造函数的调用--this引用 引用的是所生成的对象

2)方法调用--this引用 引用的是接收方对象

3)apply或call调用--this引用 引用的是有apply或call的参数指定的对象

4)其他方式的调用--this引用 引用的是全局对象

二、根据以上所述及网上的相关资料,this对象(引用)的使用情况总结如下:

JavaScript是动态语言,this关键字在执行的时候才能确定是谁。所以this永远指向调用者,即对“调用对象”的引用。简单点说就是调用的方法属于哪个对象,this就指向那个对象。根据函数调用方式的不同,this可以 指向全局对象,当前对象,或其他任意对象。

1、全局函数调用,全局函数中的this会指向全局对象window。(函数调用模式)

//代码清单1
<script type="text/javascript">
var message = "this in window"; //这一句写在函数外面和里面是一样效果
function func() {
if(this == window){
alert("this == window"); 
alert(message);
this.methodA = function() {
alert("I'm a function");
}
}
}
func(); //如果不调用func方法,则里面定义的属性或方法会取不到 
methodA();
</script>

func()的调用结果为this == window, this in window

methodA()的调用结果为I'm a function

2、构造函数调用,即使用new的方式实例化一个对象,this会指向通过构造函数生成的对象。(构造器调用模式)

代码清单2

<script type="text/javascript">
function Func() {
if (this == window) {
alert("this == window");
}
else {
alert("this != window");
}
this.fieldA = "I'm a field";
alert(this);
}
var obj = new Func();
alert(obj.fieldA); //this指向的是对象obj
</script>

3、对象方法的调用,this指向当前对象。任何函数,只要该函数被当做一个对象的方法使用或赋值时,该函数内部的this都是对该对象本身的引用。也可理解为this写在一个普通对象中,this指向的就是对象本身。(方法调用模式)

(方法的定义: 作为对象属性的函数称为方法)

//代码清单3
<script type="text/javascript">
var obj = {
x: 3,
doit: function(){
if(this == window){
alert("this == window");
}else{
alert("method is called: " + this.x);
}
}
};
obj.doit(); //this指向的是对象obj
</script>

4、通过apply或call方法调用,this指向传入的对象。

apply 或call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 (apply调用模式)

//代码清单4
<script type="text/javascript">
var obj = {
x: 3,
doit: function(){
alert("method is called: " + this.x);
}
};
var obj2 = {x: 4};
obj.doit(); //3,this指向obj
obj.doit.apply(obj2); //4,this指向obj2
obj.doit.call(obj2); //4,this指向obj2
</script>

5、原型链中的this --原型对象及构造函数中的this指向新创建的实例对象。使用prototype扩展方法可以使用this获取到源对象的实例,私有字段无法通过原型链获取。

//代码清单5
<script type="text/javascript">
function Func() {
this.fieldA = "I'm a field";
var privateFieldA = "I'm a var";
}
Func.prototype = {
ExtendMethod: function(str) {
alert(str + " :" + this.fieldA);
alert(privateFieldA); //出错,私有字段无法通过原型链获取。
}
};
var obj = new Func();
obj.ExtendMethod("From prototype"); //此时构造函数及原型链中的this指向对象obj
</script>

6、闭包中的this --闭包:写在function中的function,this指向全局对象window。

6.1 对象中的闭包

//代码清单6
<script type="text/javascript">
var name = "The window";
var obj = {
name: "My Object",
getNameFunc: function(){
return function(){
return this.name;
}
}
};
alert(obj.getNameFunc()()); //The window
</script>

此时,闭包中的this指向全局对象window,只能取到全局对象的属性。那么对象内部的属性(外部函数的变量)要想访问又怎么办呢? 把外部函数的this对象保存在一个闭包能访问的变量就可以了。看如下代码:

//代码清单7
<script type="text/javascript">
var name = "The window";
var obj = {
name: "My Object",
getNameFunc: function(){
var that = this;
return function(){
return that.name;
}
}
};
alert(obj.getNameFunc()()); //My object
</script>

将外部函数的this赋值给that变量,就能读取到外部函数的变量。

6.2 不管是直接引用function,还是实例化一个function,其返回的闭包函数里的this都是指向window。

//代码清单8
<script type="text/javascript">
function a() {
alert(this == window);
var that = this;
var func = function() {
alert(this == window);
alert(that);
};
return func;
}
var b = a();
b(); //true, true, [object Window]
var c = new a();
c(); //false, true, [object object]
</script>

7、函数使用bind()方法绑定一个对象,this会指向传给bind()函数的值。

//代码清单9
<script type="text/javascript">
window.color = "red";
var obj = {color: "blue"};
function sayColor(){
alert(this.color);
}
var objSayColor = sayColor.bind(obj);
objSayColor(); //blue
</script>

8、内嵌在HTML元素中的脚本段,this指向元素本身

//代码清单10
<div onclick="test(this)" id="div">Click Me</div>
<script type="text/javascript">
function test(obj) {
alert(obj); //[object HTMLDivElement]
}
</script>

9、写在script标签中:this就是指全局对象window。这个跟第一点的全局函数调用的全局变量一样。

以上所述是小编给大家介绍的JavaScript中的this引用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
js replace 与replaceall实例用法详解
Aug 03 Javascript
js禁止页面复制功能禁用页面右键菜单示例代码
Aug 29 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
May 05 Javascript
JS判断iframe是否加载完成的方法
Aug 03 Javascript
Javascript从数组中随机取出不同元素的两种方法
Sep 22 Javascript
基于js实现checkbox批量选中操作
Nov 22 Javascript
JS定时器实现数值从0到10来回变化
Dec 09 Javascript
Angularjs 事件指令详细整理
Jul 27 Javascript
vue使用自定义icon图标的方法
May 14 Javascript
JQuery判断radio单选框是否选中并获取值的方法
Jan 17 jQuery
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
May 09 Javascript
如何使用three.js 制作一个三维的推箱子游戏
Jul 29 Javascript
JS实现HTML表格排序功能
Aug 05 #Javascript
JavaScript如何实现跨域请求
Aug 05 #Javascript
JavaScript数组操作函数汇总
Aug 05 #Javascript
Jquery获取当前城市的天气信息
Aug 05 #Javascript
JavaScript蒙板(model)功能的简单实现代码
Aug 04 #Javascript
Three.js学习之Lamber材质和Phong材质
Aug 04 #Javascript
基于JavaScript实现在新的tab页打开url
Aug 04 #Javascript
You might like
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
php中json_encode UTF-8中文乱码的更好解决方法
2014/09/28 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
php实现两个数组相加的方法
2015/02/17 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
php给图片加文字水印
2015/07/31 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
php中try catch捕获异常实例详解
2020/08/06 PHP
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
JQuery select控件的相关操作实现代码
2012/09/14 Javascript
给ListBox添加双击事件示例代码
2013/12/02 Javascript
加载列表时jquery获取ul中第一个li的属性
2014/11/02 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
详解Nuxt.js中使用Element-UI填坑
2019/09/06 Javascript
微信小程序scroll-view的滚动条设置实现
2020/03/02 Javascript
在antd Table中插入可编辑的单元格实例
2020/10/28 Javascript
python教程之用py2exe将PY文件转成EXE文件
2014/06/12 Python
CentOS安装pillow报错的解决方法
2016/01/27 Python
Python实现线程状态监测简单示例
2018/03/28 Python
Pyqt实现无边框窗口拖动以及窗口大小改变
2018/04/19 Python
Python requests获取网页常用方法解析
2020/02/20 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
波兰最大的度假胜地和城市公寓租赁运营商:Sun & Snow
2018/10/18 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
毕业生的自我评价分享
2013/12/18 职场文书
运动会方阵解说词
2014/02/12 职场文书
2014年政协委员工作总结
2014/12/01 职场文书
三八妇女节慰问信
2015/02/14 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android