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 相关文章推荐
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
JS上传图片前实现图片预览效果的方法
Mar 02 Javascript
jQuery()方法的第二个参数详解
Apr 29 Javascript
javascript实现自动输出文本(打字特效)
Aug 27 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
Sep 24 Javascript
javascript实现无缝上下滚动特效
Dec 16 Javascript
JavaScript基础之静态方法和实例方法分析
Dec 26 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
vue data恢复初始化数据的实现方法
Oct 31 Javascript
JS实现分页导航效果
Feb 19 Javascript
如何利用node转发请求详解
Sep 17 Javascript
Node.js 中如何收集和解析命令行参数
Jan 08 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
apache+mysql+php+ssl服务器之完全安装攻略
2006/09/05 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
一张表搞清楚php is_null、empty、isset的区别
2015/07/07 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
浅析PHP 中move_uploaded_file 上传中文文件名失败
2019/04/17 PHP
js操作ajax返回的json的注意问题!
2010/02/23 Javascript
js生成随机数的方法实例
2015/10/16 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
详解JavaScript中this关键字的用法
2016/05/26 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
使用selenium抓取淘宝的商品信息实例
2018/02/06 Javascript
nodejs简单访问及操作mysql数据库的方法示例
2018/03/15 NodeJs
JS的Ajax与后端交互数据的实例
2018/08/08 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
shelve  用来持久化任意的Python对象实例代码
2016/10/12 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
Python编程深度学习绘图库之matplotlib
2018/12/28 Python
python对文件目录的操作方法实例总结
2019/06/24 Python
python实现图片转字符画
2021/02/19 Python
css3 position fixed固定居中问题解决方案
2014/08/19 HTML / CSS
匡威荷兰官方网站:Converse荷兰
2018/10/24 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
房地产销售计划书
2014/01/10 职场文书
开工庆典邀请函范文
2014/01/16 职场文书
公务员更新知识培训实施方案
2014/03/31 职场文书
根叔历年演讲稿
2014/05/20 职场文书
预备党员个人总结
2015/02/14 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
QT连接MYSQL数据库的详细步骤
2021/07/07 MySQL
SpringBoot 集成短信和邮件 以阿里云短信服务为例
2022/04/22 Java/Android