JavaScript中this的9种应用场景及三种复合应用场景


Posted in Javascript onSeptember 12, 2015

【场景1】全局环境中的this指向全局对象

this.a = 10;
alert(a);//10
b = 20;
alert(this.b);//20
var c = 30;
alert(this.c);//30

【场景2】对象内部函数的this指向调用函数的当前对象

var a = 10;
var bar = {
 a: 20,
 test: function(){
  alert(this.a);
 }
}
bar.test();//20

【场景3】全局环境函数的this指向全局对象

var a = 10;
function foo(){
 alert(this.a);
}
foo();//10

【场景4】匿名函数中的this指向全局对象

var a = 10;
var foo = {
 a: 20,
 fn: (function(){
  alert(this.a);
 })()
}
foo.fn//10

【场景5】setInterval和setTimeout定时器中的this指向全局对象

var a = 10;
var oTimer1 = setInterval(function(){
 var a = 20;
 alert(this.a);//10
 clearInterval(oTimer1);
},100);

【场景6】eval中的this指向调用上下文中的this

(function(){
 eval("alert(this)");//[object Window]
})();
function Foo(){
 this.bar = function(){
  eval("alert(this)");//[object Object]
 }
}
var foo = new Foo();
foo.bar();

【场景7】构造函数中的this指向构造出的新对象

function Person(name,age){
 this.name = name;
 this.age = age;
 this.sayName = function(){
  alert(this.name);
 }
}
var p1 = new Person('lily','20');
p1.sayName();//'lily'

【场景8】new Function中的this指向全局对象

(function(){
 var f = new Function("alert(this)");
 f();//[object Window]
})();
function Foo(){
 this.bar = function(){
  var f = new Function("alert(this)");
  f();//[object Window]
 }
}
var foo = new Foo();
foo.bar();

【场景9】apply和call中的this指向参数中的对象

var a = 10;
var foo = {
 a: 20,
 fn: function(){
  alert(this.a);
 }
};
var bar ={
 a: 30
}
foo.fn.apply();//10(若参数为空,默认指向全局对象)
foo.fn.apply(foo);//20
foo.fn.apply(bar);//30

【复合场景1】

var someone = {
 name: "Bob",
 showName: function(){
  alert(this.name);
 }
};
var other = {
 name: "Tom",
 showName: someone.showName
}
other.showName();//Tom

//以上函数相当于

var other = {
 name: "Tom",
 showName: function(){
  alert(this.name);
 }
}
other.showName();
//Tom

【复合场景2】

var name = 2;
var a = {
 name: 3,
 fn: (function(){
  alert(this.name);
 })(),
 fn1:function(){
  alert(this.name);
 }
}
a.fn;//2[匿名函数中的this指向全局对象]
a.fn1();//3[对象内部函数的this指向调用函数的当前对象]

【复合场景3】

var name = "Bob"; 
var nameObj ={ 
 name : "Tom", 
 showName : function(){ 
 alert(this.name); 
}, 
 waitShowName : function(){
  var that = this;
  setTimeout(function(){
   that.showName();
  }, 1000);
 }
}; 
nameObj.waitShowName();//"Tom"[that=this改变this的指向,使this从指向全局变量变化到指向nameObj]

var name = "Bob"; 
var nameObj ={ 
 name : "Tom", 
 showName : function(){ 
  alert(this.name); 
 }, 
 waitShowName : function(){
  var that = this;//that指向nameObj
  setTimeout(function(){
   (function(){ 
    alert(this.name);
   })();
  }, 1000);
 }
}; 
nameObj.waitShowName();// 'Bob'[形成匿名函数,this指向全局变量]

本文给大家介绍了this中的9种应用场景,希望对大家有所帮助,本站每天都有新的内容更新,请广大网友持续关注本站,谢谢。

Javascript 相关文章推荐
JS去掉第一个字符和最后一个字符的实现代码
Feb 20 Javascript
用js读、写、删除Cookie代码续篇
Dec 03 Javascript
JavaScript获得当前网页来源页面(即上一页)的方法
Apr 03 Javascript
充分发挥Node.js程序性能的一些方法介绍
Jun 23 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
Nov 17 Javascript
JavaScript基础重点(必看)
Jul 09 Javascript
vue实现一个移动端屏蔽滑动的遮罩层实例
Jun 08 Javascript
js异步编程小技巧详解
Aug 14 Javascript
angular.js4使用 RxJS 处理多个 Http 请求
Sep 23 Javascript
django使用channels2.x实现实时通讯
Nov 28 Javascript
微信小程序实现发微博功能的示例代码
Jun 24 Javascript
详解JavaScript中的数据类型,以及检测数据类型的方法
Sep 17 Javascript
javascript判断网页是关闭还是刷新
Sep 12 #Javascript
js查看一个函数的执行时间实例代码
Sep 12 #Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
Sep 12 #Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
Sep 11 #Javascript
JS实现仿Windows7风格的网页右键菜单效果代码
Sep 11 #Javascript
jQuery+css实现的蓝色水平二级导航菜单效果代码
Sep 11 #Javascript
js实现的后台左侧管理菜单代码
Sep 11 #Javascript
You might like
帅气的琦玉老师
2020/03/02 日漫
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
jMessageBox 基于jQuery的窗口插件
2009/12/09 Javascript
利用jquery包将字符串生成二维码图片
2013/09/12 Javascript
setTimeout自动触发一个js的方法
2014/01/15 Javascript
初识SmartJS - AOP三剑客
2014/06/08 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
JavaScript仿商城实现图片广告轮播实例代码
2016/02/06 Javascript
jQuery实现的导航下拉菜单效果示例
2016/09/05 Javascript
Bootstrap3 模态框使用实例
2017/02/22 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
微信小程序中使用自定义图标(阿里icon)的方法
2018/08/20 Javascript
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
[06:53]DOTA2每周TOP10 精彩击杀集锦vol.3
2014/06/25 DOTA
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python扫描IP段查看指定端口是否开放的方法
2015/06/09 Python
Android应用开发中Action bar编写的入门教程
2016/02/26 Python
Python中Iterator迭代器的使用杂谈
2016/06/20 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Tensorflow卷积神经网络实例
2018/05/24 Python
PyCharm的设置方法和第一个Python程序的建立
2019/01/16 Python
Python+OpenCV采集本地摄像头的视频
2019/04/25 Python
利用python3 的pygame模块实现塔防游戏
2019/12/30 Python
用CSS3的box-reflect来制作倒影效果
2016/11/15 HTML / CSS
中国排名第一的外贸销售网站:LightInTheBox.com(兰亭集势)
2016/10/28 全球购物
Rockport乐步美国官网:风靡美国的白宫鞋
2016/11/24 全球购物
Expedia挪威官网:酒店、机票和租车
2018/03/03 全球购物
化学教师教学反思
2014/01/17 职场文书
最经典的商业地产项目广告词
2014/03/13 职场文书
会计毕业生自荐书
2014/06/12 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
《司马光》教学反思
2016/02/22 职场文书
sql字段解析器的实现示例
2021/06/23 SQL Server
搭建Yolov5服务器
2022/04/30 Servers
vue ant design 封装弹窗表单的使用
2022/06/01 Vue.js