你不知道的JavaScript——this词法
https://www.cnblogs.com/hutaoer/p/3423782.html
https://www.cnblogs.com/vicky-li/p/8669549.html
https://www.cnblogs.com/sspeng/p/6633204.html
https://www.jb51.net/article/112334.htm
https://www.cnblogs.com/heshan1992/p/6667596.html
var obj={
id:"awesome",
cool:function coolFn(){
console.log(this.id);
}
};
var id="not awesome";
obj.cool(); //awesome
setTimeout(obj.cool,100); //not awesome
setTimeout方法是挂在window对象下的。《JavaScript高级程序设计》:超时调用的代码都是在全局作用域中执行的,因此函数中this的值在非严格模式下指向window对象,在严格模式下是undefined。
setTimeoutff中所执行函数中的this,永远指向window!注意是要延迟执行的函数中的this。
setTimeout调用环境中的this的指向是需要根据上下文来确定的,默认为window,延迟执行函数中的this就是指向window。
上面代码问题在于setTimeout中的cool()函数丢失了同this之间的绑定。解决这个问题有好几种办法,但最常见的就是var self=this; 如下:
var obj={
count:0,
cool:function(){
var self=this;
if(self.count<1){
setTimeout(function timer(){
self.count++;
console.log("awesome?");
},100);
}
}
}
obj.cool();//awesome?
ES6中的箭头函数引入了一个叫作this词法的行为:
var obj={
count:0,
cool:function coolFn(){
if(this.count<1){
setTimeout( ()=>{
this.count++;
console.log("awesome?");
},100)
}
}
};
obj.cool(); //awesome?
箭头函数在涉及this绑定时的行为和普通函数的行为完全不一致。它放弃了所有普通this绑定的规则,取而代之的是用当前的词法作用域覆盖了this本来的值。
var obj={
count:0,
cool:function(){
if(this.count<1){
setTimeout(function(){
this.count++;
console.log('more awesome');
}.bind(this),100);
}
}
}
obj.cool();
函数调用的方式有4种,this也有4种指向:
1.独立调用:func(),函数独立调用,this指向window
2.方法调用:obj.func(),函数作为obj的一个方法(属性)调用,this指向obj.
3.构造函数调用:new Func(),如果在一个函数前面带上new关键字来调用,那么背地里将会创建一个连接到该函数的prototype的新对象,this指向这个新的对象。
4.call、apply、bind调用:func.call(obj,value1,valu2); func.apply(obj,[value1,value2]); func.bind(obj,value1,value2)(); fun.bind(obj)(value1,value2); 动态改变this的指向obj。
你不知道的JavaScript——this词法的更多相关文章
- JavaScript词法作用域—你不知道的JavaScript上卷读书笔记(一)
前段时间在每天往返的地铁上抽空将 <你不知道的JavaScript(上卷)>读了一遍,这本书很多部分写的很是精妙,对于接触前端时间不太久的人来说,就好像是叩开了JavaScript的另一扇 ...
- 【你不知道的javaScript 上卷 笔记5】javaScript中的this词法
function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面这段代码为什 ...
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
- 读书笔记-你不知道的JavaScript(上)
本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...
- 读《你不知道的JavaScript(上卷)》后感-作用域闭包(二)
github原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们, ...
- 你不知道的javaScript上卷(第一章 作用域是什么)
在写这篇博客时这本书我已经是看过一遍了,为了加深印象和深入学习于是打算做这系列的前端经典书籍导读博文,大家如果觉得这本书讲的好可以自己买来看看,我是比较喜欢看纸质版书的,因为这样才有读书的那种感觉. ...
- JavaScript中的this(你不知道的JavaScript)
JavaScript中的this,刚接触JavaScript时大家都在大肆渲染说其多么多么的灵巧重要,然而自己并不关心:随着自己对JavaScript一步步深入了解,突然恍然大悟,原来它真的很重要!所 ...
- 《你不知道的 JavaScript 上卷》 学习笔记
第一部分: 作用域和闭包 一.作用域 1. 作用域:存储变量并且查找变量的规则 2. 源代码在执行之前(编译)会经历三个步骤: 分词/此法分析:将代码字符串分解成有意义的代码块(词法单元) 解析/语法 ...
- 你不知道的JavaScript --- 作用域相关
本篇是<你不知道的JavaScript>的读书笔记 什么是作用域? 程序离不变量,那么变量存储在哪里?程序需要时如何找到他们? 这些问题说明需要一套设计良好的规则来存储变量, 并且之后可以 ...
随机推荐
- 设计模式のObserver Pattern(观察者模式)----行为模式
一.问题产生背景 又被称为订阅发布模式. 最初流传最广的一个面试题:有一只猫咪,猫咪叫了一声,老鼠跑了,老人惊醒了,男主人骂,小偷吓得不敢动了....这就产生一个问题的模型,当对象间存在一对多关系时, ...
- 如何在python中把两个列表的各项分别合并为列表
[ [a,b] for a,b in zip(list1,list2)] 生成一个以列表list1,list2各项合并列表为元素的列表
- 使用readAsDataURL方法预览图片
使用FileReader接口的readAsDataURL方法实现图片的预览. 在FileReader出现之前,前端的图片预览是这样实现的:把本地图片上传到服务器,服务器把图片地址返回,并把它替换到图片 ...
- [matlab] 22.matlab图论实例 最短路问题与最小生成树 (转载)
最短路问题之 Floyd 某公司在六个城市 c1c1,c2c2,….,c6c6 中有分公司,从 cici 到 cjcj 的直接航程票价记在下述矩阵的 (ii,jj) 位置上. (∞∞表示无直接航路), ...
- Visual Studio 2013 编译 64 位 Python 的 C 扩展 (使用 PyObject 包装)
对于 32 位 Python 的 C 扩展,以前用过 mingW32 编译, 但是 mingW32 不支持 64 位 Python 的 C 扩展编译,详情可见 stackoverflow,这位前辈的大 ...
- 20175329 2018-2019-3《Java程序设计》第五周学习总结
学号 20175329 2018-2019-3<Java程序设计>第五周学习总结 教材学习内容总结 第六章 接口与实现 使用关键字interface来定义一个接口.接口定义和类的定义十分相 ...
- 从MFQ方法到需求分析
前几天看了一篇性能测试相关的文章:性能测试模型初探及应用方法分析,其中提到了MFQ分析方法.专门去查阅了MFQ相关的一些资料,学习了一番. 之后想起了以前看<Google的软件测试之道>这 ...
- Shell第二篇:正则表达式和文本处理工具
一 什么是正则 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则. 生活中处处都是正则: 比如我们描述:4条腿 ...
- Gym101138D Strange Queries/BZOJ5016 SNOI2017 一个简单的询问 莫队、前缀和、容斥
传送门--Gym 传送门--BZOJ THUWC2019D1T1撞题可还行 以前有些人做过还问过我,但是我没有珍惜,直到进入考场才追悔莫及-- 设\(que_{i,j}\)表示询问\((1,i,1,j ...
- Spring整合ActiveMQ及多个Queue消息监听的配置
消息队列(MQ)越来越火,在java开发的项目也属于比较常见的技术,MQ的相关使用也成java开发人员必备的技能.笔者公司采用的MQ是ActiveMQ,且消息都是用的点对点的模式.本文记录了实 ...