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 相关文章推荐
求解开jscript.encode代码的asp函数
Feb 28 Javascript
Div Select挡住的解决办法
Aug 07 Javascript
jQuery选中select控件 无法设置selected的解决方法
Sep 01 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
Nov 30 Javascript
使用JSLint提高JS代码质量方法分享
Dec 16 Javascript
jQuery的load()方法及其回调函数用法实例
Mar 25 Javascript
基于jQuery实现表格内容的筛选功能
Aug 21 Javascript
微信小程序  action-sheet详解及实例代码
Nov 09 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
Sep 15 Javascript
jQuery实现菜单的显示和隐藏功能示例
Jul 24 jQuery
vue中Axios的封装与API接口的管理详解
Aug 09 Javascript
小程序wx.getUserProfile接口的具体使用
Jun 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
php 发送带附件邮件示例
2014/01/23 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
thinkPHP中钩子的两种配置调用方法详解
2016/11/11 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
php适配器模式简单应用示例
2019/10/23 PHP
事件绑定之小测试  onclick && addEventListener
2011/07/31 Javascript
Jquery实现顶部弹出框特效
2015/08/08 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
剖析Node.js异步编程中的回调与代码设计模式
2016/02/16 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
js 函数式编程学习笔记
2017/03/25 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
详解无限滚动插件vue-infinite-scroll源码解析
2019/05/12 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
mpvue微信小程序的接口请求fly全局拦截代码实例
2019/11/13 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
python集合类型用法分析
2015/04/08 Python
理想高通滤波实现Python opencv示例
2019/01/30 Python
Python通用函数实现数组计算的方法
2019/06/13 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
linux环境中没有网络怎么下载python
2019/07/07 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
白宫黑市官网:White House Black Market
2016/11/17 全球购物
Pam & Gela官网:美国性感前卫女装品牌
2018/07/19 全球购物
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
CSMA/CD介质访问控制协议
2015/11/17 面试题
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
结婚典礼证婚词
2014/01/08 职场文书
国培远程培训感言
2014/03/08 职场文书
党员四风自我剖析材料
2014/10/07 职场文书
中学生自我评价2015
2015/03/03 职场文书
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android
关于EntityWrapper的in用法
2022/03/22 Java/Android