闭包、this、ES6特性
声明一个函数 function fun1
函数内定义一个变量比如 var x=1
如果这时候在function内声明一个函数 fun2
fun2中对这个函数外面的x进行操作
这时候把fun2的地址付给函数外面的一个变量A
形成一个函数表达式,
因为JS中的作用域是从内层向外层找变量的值
每次运行A 即A()的时候都需要找之前那个x 这时候函数fun1就叫作一个闭包(closure) ,这个x会一直留在内存中不会被回收 即 —(closure:fun1)
fun2 fun1 全局 ---> 作用域链
| (包起来了) |
| |
----------------------------
|
|
形成了一个闭包
因为全局和fun2的作用域连结起来了
讲一下this:
1.this是在一个函数被调用时确定的。(注意函数这两个大字)
2.函数被调用的时候 如果函数被某一个对象所拥有, 那么this指向这个对象。
3.如果函数独立调用,this指向undefined,在非严格模式下指向window
4.当this为某个(属性:值)键值对中的值的内容时,先找那个函数,再找那个函数的对象,要是没有函数就是window
关于第四点:
var obj = { a:this };
console.log(obj.a); <-没有函数,最后找到window
// demo
var a = 20;
var obj = {
a: 10,
c: this.a + 20, <--这里的this是window
fn: function () {
return this.a; <--函数fn属于obj对象,这里的this是obj
}
}
console.log(obj.c);
console.log(obj.fn());
// demo2
'use strict';
var a = 20;
function foo () {
var a = 1;
var obj = {
a: 10,
c: this.a + 20, <--这里this,先看他在 函数 foo里面,然后foo并不属于任何对象 所以是undefined
fn: function () {
return this.a;
}
}
return obj.c;
}
console.log(foo()); // ?
console.log(window.foo()); // ? <-- window对象中的foo
写一个粘合函数:
function glue(){
var a = Array.prototype.slice.call(arguments); //call中的this指向了arguments
console.log(a.join(''));
}
glue('把',123,'我','粘合','起来吧');
讲一下箭头函数:
function a(){
var x = 20;
return function(){
this.x;
}
}
a();
这样return的是10。(this是在函数被调用时确定的,return的这个function不属于任何对象,所以这个function中的this是undefined,在非严格下是window)
如果是用 return ()=> this.x this是他外面的this
原因:箭头函数中没有this,如果在箭头函数中使用this,则这个this一定是他外层的this 即爸爸function的this!!
闭包、this、ES6特性的更多相关文章
- 最常用的ES6特性(转)
最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...
- 最常用的ES6特性
遇到了要写出es6新特性的题目,所以查阅了资料来总结一下,点击查看原文. 进入正题,最常用的ES6特性有:let, const, class, extends, super, arrow functi ...
- ES6特性
一.ES6特性: let, const, class, extends, super, arrow functions, template string, destructuring, default ...
- 第四节:教你如何快速让浏览器兼容ES6特性
写在正文前,本来这一节的内容应该放在第二节更合适,因为当时就有同学问ES6的兼容性如何,如何在浏览器兼容ES6的特性,这节前端君会介绍一个抱砖引玉的操作案例. 为什么ES6会有兼容性问题? 由于广大用 ...
- 解决浏览器兼容ES6特性
为什么ES6会有兼容性问题? 由于广大用户使用的浏览器版本在发布的时候也许早于ES6的定稿和发布,而到了今天,我们在编程中如果使用了ES6的新特性,浏览器若没有更新版本,或者新版本中没有对ES6的特性 ...
- 现在就可以使用的5个 ES6 特性
小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货.各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握. ...
- 解决让浏览器兼容ES6特性
为什么ES6会有兼容性问题? 由于广大用户使用的浏览器版本在发布的时候也许早于ES6的定稿和发布,而到了今天,我们在编程中如果使用了ES6的新特性,浏览器若没有更新版本,或者新版本中没有对ES6的特性 ...
- js数组操作find查找特定值结合es6特性
js数组操作find查找特定值结合es6特性
- 9个常用ES6特性归纳(一般用这些就够了)
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应 ...
随机推荐
- java中String和int的互相转化
1. String 转 int 方式1:Integer.parseInt(); 方式2: Integer.valueOf(myStr).intValue(); 2. int 转String 方式1: ...
- Codeforces Round #468 (Div. 2, based on Technocup 2018 Final Round)D. Peculiar apple-tree
In Arcady's garden there grows a peculiar apple-tree that fruits one time per year. Its peculiarity ...
- JTextArea+JScrollPane滚动条自动在最下边(转帖)
这是我制作五子棋的过程中遇到的问题,在网上搜了好几种答案,分别列在下面了.不过感觉第一种相当方便.用得简洁,爽! 1. 利用JTextArea的selectAll();方法在添加信息之后强制将光标移动 ...
- Oracle 知识积累
1.oracle存储过程中is和as的区别 在存储过程(PROCEDURE)和函数(FUNCTION)中没有区别,在视图(VIEW)中只能用AS不能用IS,在游标(CURSOR)中只能用IS不能用AS ...
- Vue学习之路第十五篇:v-if和v-show指令
1.v-if和v-show都是用来实现条件判断的指令. 2.先看代码 <body> <div id="app"> <button @click=&qu ...
- Flex教程
详细教程: 1.基础知识:一劳永逸的搞定 flex 布局 2.阮一峰的flex教程:flex syntax flex example
- [luogu4053 JSOI2007] 建筑抢修 (贪心 优先队列)
传送门 题目描述 小刚在玩JSOI提供的一个称之为"建筑抢修"的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤 ...
- string转utf8后解决TTS识别中文的问题
今天遇到string字符编码的问题,由于遇到了用TTS将文本转语音的一个API,里面的中文必须是utf8的,我传了一个uncode编码的中文进去,就一直不能正常读出来.后来才发现是编码的问题.这里在网 ...
- Nagios监控nginx服务具体过程
1在nginx 服务器上安装nrpe客户端: Nginx的服务须要监控起来.不然万一down了而不及时修复,会影响web应用.例如以下web应用上面启动的nginx后台进程[root@lb-net-2 ...
- 0x02 枚举、模拟、递推
1.TYVJ1266(这站是不是已经倒闭了啊) USACO陈年老题,对于这种开关问题啊,最多只按一次,而且第一行随便按完下面的就全确定了,类似的还有固定翻转一个长度的区间,这个也是最多翻一次的而且翻的 ...