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 相关文章推荐
Web前端设计模式  制作漂亮的弹出层
Oct 29 Javascript
jQuery中focus事件用法实例
Dec 26 Javascript
javascript下使用Promise封装FileReader
Feb 19 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
Jul 10 Javascript
总结Node.js中的一些错误类型
Aug 15 Javascript
ionic实现带字的toggle滑动组件
Aug 27 Javascript
Bootstrap php制作动态分页标签
Dec 23 Javascript
bootstrap警告框使用方法解析
Jan 13 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
Feb 10 Javascript
js实现自动图片轮播代码
Mar 22 Javascript
jQuery+PHP实现上传裁剪图片
Jun 29 jQuery
JS实现的冒泡排序,快速排序,插入排序算法示例
Mar 02 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
ADODB结合SMARTY使用~超级强
2006/11/25 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
Thinkphp框架使用list_to_tree 实现无限级分类列出所有节点示例
2020/04/04 PHP
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
浅谈JavaScript函数参数的可修改性问题
2013/12/05 Javascript
JavaScript中的对象与JSON
2015/07/03 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
JS碰撞运动实现方法详解
2016/12/15 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
JavaScript定义及输出螺旋矩阵的方法详解
2017/12/01 Javascript
纯JS实现出生日期[年月日]下拉菜单效果
2018/06/01 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
浅谈小程序 setData学问多
2019/02/20 Javascript
微信小程序控制台提示warning:Now you can provide attr "wx:key" for a "wx:for" to improve performance解决方法
2019/02/21 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现将汉字转换成汉语拼音的库
2015/05/05 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
python如何制作英文字典
2019/06/25 Python
python语言实现贪吃蛇游戏
2020/11/13 Python
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
周生生珠宝香港官网:Chow Sang Sang(香港及海外配送)
2019/09/05 全球购物
美国Max仓库:Max Warehouse
2020/05/31 全球购物
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
大学生物业管理求职信
2013/10/24 职场文书
财务部岗位职责
2013/11/19 职场文书
初中政治教学反思
2014/01/17 职场文书
20年同学聚会感言
2014/02/03 职场文书
安全承诺书范文
2014/03/26 职场文书
踏青活动策划方案
2014/08/19 职场文书
正风肃纪剖析材料范文
2014/10/10 职场文书
初中英语教学反思范文
2016/02/15 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android