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 相关文章推荐
用javascript实现的图片马赛克后显示并切换加文字功能
Apr 21 Javascript
window.open被浏览器拦截后的自定义提示效果代码
Nov 19 Javascript
浅析javascript闭包 实例分析
Dec 25 Javascript
Jquery ajaxStart()与ajaxStop()方法(实例讲解)
Dec 18 Javascript
Jquery给基本控件的取值、赋值示例
May 23 Javascript
jquery获取radio值实例
Oct 16 Javascript
jquery中filter方法用法实例分析
Feb 06 Javascript
js判断iframe中元素是否存在的实现代码
Dec 24 Javascript
javascript编写简易计算器
May 06 Javascript
微信小程序 本地图片按照屏幕尺寸处理
Aug 04 Javascript
video.js 一个页面同时播放多个视频的实例代码
Nov 27 Javascript
js实现点击选项置顶动画效果
Aug 25 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的面试题集
2006/11/19 PHP
PHP使用ob_start生成html页面的方法
2014/11/07 PHP
php+MySQL实现登录时验证登录名和密码是否正确
2016/05/10 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
ASP中进行HTML数据及JS数据编码函数
2009/11/11 Javascript
Javascript的getYear、getFullYear、getUTCFullYear异同分享
2011/11/30 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
编程语言JavaScript简介
2014/10/16 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
微信小程序webview 脚手架使用详解
2019/07/22 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
vue+element导航栏高亮显示的解决方式
2019/11/12 Javascript
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
Python3实现的Mysql数据库操作封装类
2018/06/06 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
对python numpy.array插入一行或一列的方法详解
2019/01/29 Python
PyCharm搭建Spark开发环境的实现步骤
2019/09/05 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
软件工程专业推荐信
2013/10/28 职场文书
大学军训感言800字
2014/02/27 职场文书
校园文明倡议书
2014/05/16 职场文书
2014年接待工作总结
2014/11/26 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
企业反腐倡廉心得体会
2015/08/15 职场文书
JS不要再到处使用绝对等于运算符了
2021/04/30 Javascript
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers