this的九种常用场景(转子jb51.net)
【场景1】全局环境中的this指向全局对象
this.a = ;
alert(a);//
b = ;
alert(this.b);//
var c = ;
【场景2】对象内部函数的this指向调用函数的当前对象
var a = ;
var bar = {
a: ,
test: function(){
alert(this.a);
}
}
bar.test();//
【场景3】全局环境函数的this指向全局对象
var a = ;
function foo(){
alert(this.a);
}
foo();//
【场景4】匿名函数中的this指向全局对象
var a = ;
var foo = {
a: ,
fn: (function(){
alert(this.a);
})()
}
foo.fn//
【场景5】setInterval和setTimeout定时器中的this指向全局对象
var a = ;
var oTimer1 = setInterval(function(){
var a = ;
alert(this.a);//
clearInterval(oTimer1);
},);
【场景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','');
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();
以上指向全局。
var obj = {
name : "江太公",
sex : "男",
action : new Function("console.log(this)")
}
obj.action();
-- ::45.684 VM4742:
Object {name: "江太公", sex: "男"}
以上指向调用对象。
【场景9】apply和call中的this指向参数中的对象
var a = ;
var foo = {
a: ,
fn: function(){
alert(this.a);
}
};
var bar ={
a:
}
foo.fn.apply();//10(若参数为空,默认指向全局对象)
foo.fn.apply(foo);//
foo.fn.apply(bar);//
【复合场景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 = ;
var a = {
name: ,
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();
}, );
}
};
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);
})();
}, );
}
};
nameObj.waitShowName();// 'Bob'[形成匿名函数,this指向全局变量]
补充:
DOM事件处理函数中的 this
当函数被用作事件处理函数时,它的this指向触发事件的元素(一些浏览器在动态添加监听器时不遵守这个约定,除非使用addEventListener 这句不太确定翻译的是否正确)。
// 被调用时,将关联的元素变成蓝色
function bluify(e){
console.log(this === e.currentTarget); // 总是 true // 当 currentTarget 和 target 是同一个对象是为 true
console.log(this === e.target);
this.style.backgroundColor = '#A5D9F3';
} // 获取文档中的所有元素的列表
var elements = document.getElementsByTagName('*'); // 将bluify作为元素的点击监听函数,当元素被点击时,就会变成蓝色
for(var i=0 ; i<elements.length ; i++){
elements[i].addEventListener('click', bluify, false);
}
内联事件处理函数中的 this
当代码被内联处理函数调用时,它的this指向监听器所在的DOM元素:
<button onclick="alert(this.tagName.toLowerCase());">
Show this
</button>
上面的alert会显示button。注意只有外层代码中的this是这样设置的:
<button onclick="alert((function(){return this})());">
Show inner this
</button>
在这种情况下,没有设置内部函数的 this,所以它指向 global/window 对象(即非严格模式下调用的函数未设置 this 时指向的默认对象)。
- All
- Errors
- Warnings
- Info
- Logs
- Debug
- Handled
- Object {name: "江太公", sex: "男"}
this的九种常用场景(转子jb51.net)的更多相关文章
- Rational Rose 画九种常用架构图
UML建模详解(3)—使用Rational Rose 画九种常用架构图 UML是一种建模语言,是系统建模的标准.我们之所以建模是因为大规模的系统设计时相当复杂的,当系统比较复杂时就会涉及到以下这几 ...
- 【Algorithm】九种常用排序的性能分析
最近间间断断的将9种排序算法用C实现,并且将其以博客笔记的形式记录下来,其中各个排序算法的描述部分特别参考了CSDN上太阳落雨的博客!现在就该来综合的分析这九种排序,让我们先来看看其算法复杂度和稳定性 ...
- rbac-基于角色的权限控制系统(8种常用场景再现)
首先要抛出的问题是在代码世界里什么是权限? url就代表权限 如何实现权限控制? 下面详细介绍控制流程 1.1简单权限控制--表结构 简单权限控制,三个model,五张表 权限表permission ...
- Git——常用场景解析
总结:本篇文章从初识GitHub.Git,实践GitHub的五种常用场景,分别是:git for windows安装,git配置,克隆远程代码到本地,上传本地代码到远程以及Git的常用指令.相信Jam ...
- 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景
作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...
- python中常用的九种数据预处理方法分享
Spyder Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...
- python中常用的九种预处理方法
本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(Standardization or Mean Removal ...
- Android UI开发第二十九篇——Android中五种常用的menu(菜单)
Android Menu在手机的应用中起着导航的作用,作者总结了5种常用的Menu. 1.左右推出的Menu 前段时间比较流行,我最早是在海豚浏览器中看到的,当时耳目一新.最早使用左右推出菜单的,听说 ...
- UML总结4---UML九种图关系说明
转自:http://blog.csdn.NET/chenyujing1234/article/details/8173519 UML中包括九种图:用例图.类图.对象图.状态图.时序图.协作图.活动图. ...
随机推荐
- 原生js实现自定义alert风格和实现
2018年6月29 最新更新 添加函数节流,解决多次点击问题,添加单例模式,提高代码性能. <!DOCTYPE html> <html lang="en"> ...
- loadrunner如何监控windows系统的资源
1.测试客户端与服务器之间的网络,保证通信畅通 2.开启服务器端Windows中的如下两个服务,可见系统服务中查找,cmd输入:services.msc 如下图: Remote Registry需改为 ...
- 面试中常用排序算法的python实现和性能分析
这篇是关于排序的,把常见的排序算法和面试中经常提到的一些问题整理了一下.这里面大概有3个需要提到的问题: 虽然专业是数学,但是自己还是比较讨厌繁琐的公式,所以基本上文章所有的逻辑,我都尽可能的用大白话 ...
- 用svmpredict输出的结果为空
源程序:
- 封装字符串的Format操作
相信即使再讨厌MFC的朋友也不会把厌恶牵扯到CString类上,而且CString现在也提升为ATL和MFC的共享类.用CString类,当然不能忘记它的Format方法,其用于格式化字符串.示例操作 ...
- Redis 学习之常用命令及安全机制
该文使用centos6.5 64位 redis3.2.8 一.redis常用命令 键值常用命令: 1. keys 返回满足pattern的所有key. 127.0.0.1:6379> ke ...
- BZOJ 1597 土地购买(斜率优化DP)
如果有一块土地的长和宽都小于另一块土地的长和宽,显然这块土地属于“赠送土地”. 我们可以排序一下将这些赠送土地全部忽略掉,一定不会影响到答案. 那么剩下的土地就是长递减,宽递增的.令dp[i]表示购买 ...
- (八)Redis事务与连接操作
事务: multi # 标记一个事务块的开始.事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由EXEC命令原子性地执行 exec # 执行所有事务块内的命令 descard # 取消事务,放 ...
- (转)如何用U盘创建Linux系统盘
(转)http://teliute.org/linux/TeUbt/lesson60/lesson60.html 创建一个U盘linux安装盘,用以启动系统并安装: 1.启动盘创建器 1)点击主按钮, ...
- [bzoj3712][PA2014]Fiolki
description 题面 data range \[ 0\le m<n\le 200000,0\le k\le 500000\] solution 之前本人一直煞笔地思考暴力是否可行 考虑按 ...