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 相关文章推荐
使用jQuery将多条数据插入模态框的实现代码
Oct 08 Javascript
javascript日期格式化方法小结
Dec 17 Javascript
学习使用jquery iScroll.js移动端滚动条插件
Mar 24 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
Jun 24 Javascript
使用开源工具制作网页验证码的方法
Oct 17 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
Apr 10 jQuery
微信小程序 rich-text的使用方法
Aug 04 Javascript
webpack写jquery插件的环境配置
Dec 21 jQuery
详解vscode中vue代码颜色插件
Oct 11 Javascript
怎么理解wx.navigateTo的events参数使用详情
May 18 Javascript
微信小程序picker组件两列关联使用方式
Oct 27 Javascript
JavaScript设计模式之原型模式详情
Jun 21 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
亚洲咖啡有什么?亚洲咖啡产地介绍 亚洲咖啡有什么特点?
2021/03/05 新手入门
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
javascript笔记 String类replace函数的一些事
2011/09/22 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
使用jquery.upload.js实现异步上传示例代码
2014/07/29 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
2016/06/12 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
详解webpack介绍&安装&常用命令
2017/06/29 Javascript
Node.js dgram模块实现UDP通信示例代码
2017/09/26 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
vue服务端渲染添加缓存的方法
2018/09/18 Javascript
js实现录音上传功能
2019/11/22 Javascript
[07:52]2014DOTA2 TI逗比武士游V社解说背后的故事
2014/07/10 DOTA
Python进阶-函数默认参数(详解)
2017/05/18 Python
六行python代码的爱心曲线详解
2019/05/17 Python
Python 迭代,for...in遍历,迭代原理与应用示例
2019/10/12 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
Python爬虫爬取电影票房数据及图表展示操作示例
2020/03/27 Python
Python Selenium自动化获取页面信息的方法
2020/08/31 Python
跑步、骑行和铁人三项的高性能眼镜和服装:ROKA
2018/07/06 全球购物
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
审计主管岗位职责
2014/01/31 职场文书
光盘行动倡议书
2014/02/02 职场文书
收银出纳员岗位职责
2014/02/23 职场文书
勿忘国耻9.18演讲稿(经典篇)
2014/09/14 职场文书
幼儿园教师管理制度
2015/08/05 职场文书
python 三边测量定位的实现代码
2021/04/22 Python
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers