【场景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 时指向的默认对象)。

 
Regex
Hide network messages
  • All
 
  • Errors
  • Warnings
  • Info
  • Logs
  • Debug
  • Handled
 
var obj = { name : "江太公", sex : "男", action : new Function("console.log(this)") } obj.action();
2017-01-20 11:07:45.684 VM4742:2

  1. Object {name: "江太公", sex: "男"}

this的九种常用场景(转子jb51.net)的更多相关文章

  1. Rational Rose 画九种常用架构图

    UML建模详解(3)—使用Rational Rose 画九种常用架构图   UML是一种建模语言,是系统建模的标准.我们之所以建模是因为大规模的系统设计时相当复杂的,当系统比较复杂时就会涉及到以下这几 ...

  2. 【Algorithm】九种常用排序的性能分析

    最近间间断断的将9种排序算法用C实现,并且将其以博客笔记的形式记录下来,其中各个排序算法的描述部分特别参考了CSDN上太阳落雨的博客!现在就该来综合的分析这九种排序,让我们先来看看其算法复杂度和稳定性 ...

  3. rbac-基于角色的权限控制系统(8种常用场景再现)

    首先要抛出的问题是在代码世界里什么是权限? url就代表权限 如何实现权限控制? 下面详细介绍控制流程 1.1简单权限控制--表结构 简单权限控制,三个model,五张表 权限表permission ...

  4. Git——常用场景解析

    总结:本篇文章从初识GitHub.Git,实践GitHub的五种常用场景,分别是:git for windows安装,git配置,克隆远程代码到本地,上传本地代码到远程以及Git的常用指令.相信Jam ...

  5. 2 万字 + 20张图| 细说 Redis 九种数据类型和应用场景

    作者:小林coding 计算机八股文网(操作系统.计算机网络.计算机组成.MySQL.Redis):https://xiaolincoding.com 大家好,我是小林. 我们都知道 Redis 提供 ...

  6. python中常用的九种数据预处理方法分享

    Spyder   Ctrl + 4/5: 块注释/块反注释 本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(St ...

  7. python中常用的九种预处理方法

    本文总结的是我们大家在python中常见的数据预处理方法,以下通过sklearn的preprocessing模块来介绍; 1. 标准化(Standardization or Mean Removal ...

  8. Android UI开发第二十九篇——Android中五种常用的menu(菜单)

    Android Menu在手机的应用中起着导航的作用,作者总结了5种常用的Menu. 1.左右推出的Menu 前段时间比较流行,我最早是在海豚浏览器中看到的,当时耳目一新.最早使用左右推出菜单的,听说 ...

  9. UML总结4---UML九种图关系说明

    转自:http://blog.csdn.NET/chenyujing1234/article/details/8173519 UML中包括九种图:用例图.类图.对象图.状态图.时序图.协作图.活动图. ...

随机推荐

  1. 移动端的picker参考vux

    参考vux移动端的ui组件,做了一个picker,测试在微信,uc主流浏览器能够正常工作.而在华为浏览器根本不能使用.而测试了vux的原有picker组件,发现在华为自带浏览器中,效果依然能够实现. ...

  2. windows批处理学习---01

    一. 标记符号: CR(0D) 命令行结束符 Escape(1B) ANSI转义字符引导符 Space() 常用的参数界定符 Tab() ; = 不常用的参数界定符 + COPY命令文件连接符 * ? ...

  3. mysql指定编码格式创建数据库

    CREATE DATABASE `dev` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  4. C#的垃圾回收

    C#中垃圾回收 GC.Collect();强制进行内存回收.

  5. [CLR via C#]值类型的装箱和拆箱

    我们先来看一个示例代码: namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Array ...

  6. Maven jeetsite项目 搭建

    , 一直没有系统的总结一下Maven的知识,今天,想从网上找一个Maven的项目,练练手,顺便学习一下maven的原理 和布局. 官网:http://www.jeesite.com/ 没想到,上来就给 ...

  7. Mysql查询优化从入门到跑路(三)查询的基本操作

    查询的基本操作 1.选择操作 对应的是限制条件,操作对象是二维表的行.     优化方式:选择操作下推     目的:尽量减少连接操作前的元租数,使得中间临时关系尽量少(元祖数少,连接得到的元组数就少 ...

  8. Square Root of Permutation - CF612E

    Description A permutation of length n is an array containing each integer from 1 to n exactly once. ...

  9. BZOJ4942 & UOJ314:[NOI2017]整数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4942 http://uoj.ac/problem/314 https://www.luogu.or ...

  10. BZOJ1012:[JSOI2008]最大数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1012 https://www.luogu.org/problemnew/show/P1198 现在 ...