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 相关文章推荐
jQuery库与其他JS库冲突的解决办法
Feb 07 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
Apr 07 Javascript
js简单抽奖代码
Jan 16 Javascript
简单学习JavaScript中的for语句循环结构
Nov 10 Javascript
javascript设置和获取cookie的方法实例详解
Jan 05 Javascript
AngularJS基础 ng-non-bindable 指令详细介绍
Aug 02 Javascript
canvas实现绘制吃豆鱼效果
Jan 12 Javascript
Form表单上传文件(type=&quot;file&quot;)的使用
Aug 03 Javascript
javaScript动态添加Li元素的实例
Feb 24 Javascript
详解Vue中组件的缓存
Apr 20 Javascript
node.js中npm包管理工具用法分析
Feb 14 Javascript
vuex入门最详细整理
Mar 04 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树的代码,可以嵌套任意层
2006/10/09 PHP
PHP爆绝对路径方法收集整理
2012/09/17 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
javascript椭圆旋转相册实现代码
2012/01/16 Javascript
javascipt基础内容--需要注意的细节
2013/04/10 Javascript
javascript模拟地球旋转效果代码实例
2013/12/02 Javascript
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
node.js学习之断言assert的使用示例
2017/09/28 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
详解vue微信网页授权最终解决方案
2019/06/16 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
Python安装第三方库的3种方法
2015/06/21 Python
Python爬虫利用cookie实现模拟登陆实例详解
2017/01/12 Python
谈一谈数组拼接tf.concat()和np.concatenate()的区别
2020/02/07 Python
python 实现汉诺塔游戏
2020/11/28 Python
RentCars.com巴西:汽车租赁网站
2016/08/22 全球购物
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
小天鹅官方商城:LittleSwan
2017/06/16 全球购物
简述安装Slackware Linux系统的过程
2012/01/12 面试题
自我鉴定 电子商务专业
2014/01/30 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
培养联系人考察意见
2015/06/01 职场文书
入党团支部推荐意见
2015/06/02 职场文书
我是特种兵观后感
2015/06/11 职场文书
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS