声明一个函数 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特性的更多相关文章

  1. 最常用的ES6特性(转)

    最常用的ES6特性 let, const, class, extends, super, arrow functions, template string, destructuring, defaul ...

  2. 最常用的ES6特性

    遇到了要写出es6新特性的题目,所以查阅了资料来总结一下,点击查看原文. 进入正题,最常用的ES6特性有:let, const, class, extends, super, arrow functi ...

  3. ES6特性

    一.ES6特性: let, const, class, extends, super, arrow functions, template string, destructuring, default ...

  4. 第四节:教你如何快速让浏览器兼容ES6特性

    写在正文前,本来这一节的内容应该放在第二节更合适,因为当时就有同学问ES6的兼容性如何,如何在浏览器兼容ES6的特性,这节前端君会介绍一个抱砖引玉的操作案例. 为什么ES6会有兼容性问题? 由于广大用 ...

  5. 解决浏览器兼容ES6特性

    为什么ES6会有兼容性问题? 由于广大用户使用的浏览器版本在发布的时候也许早于ES6的定稿和发布,而到了今天,我们在编程中如果使用了ES6的新特性,浏览器若没有更新版本,或者新版本中没有对ES6的特性 ...

  6. 现在就可以使用的5个 ES6 特性

    小编推荐:掘金是一个高质量的技术社区,从 ECMAScript 6 到 Vue.js,性能优化到开源类库,让你不错过前端开发的每一个技术干货.各大应用市场搜索「掘金」即可下载APP,技术干货尽在掌握. ...

  7. 解决让浏览器兼容ES6特性

    为什么ES6会有兼容性问题? 由于广大用户使用的浏览器版本在发布的时候也许早于ES6的定稿和发布,而到了今天,我们在编程中如果使用了ES6的新特性,浏览器若没有更新版本,或者新版本中没有对ES6的特性 ...

  8. js数组操作find查找特定值结合es6特性

    js数组操作find查找特定值结合es6特性

  9. 9个常用ES6特性归纳(一般用这些就够了)

    ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应 ...

随机推荐

  1. nyoj8-一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现 ...

  2. 树状数组求LIS

    我真的是咸鱼啊 多少年前的基础了我竟然才弄明白,哭 用树状数组维护<=x的最上上升子序列的最大值即可啊Orz 我真的菜的一笔啊! #include <bits/stdc++.h> u ...

  3. strtotime的一个使用问题

    我在开发过程中遇到这么这个问题,因为赶进度,没有记下来处理方案,在鸟哥的博客看到原理分析,很到位!平时开发中总是急着处理问题,没有深入分析和记录问题. 1.问题: 今天是2018-07-31 执行代码 ...

  4. RobotFrameWork+APPIUM实现对安卓APK的自动化测试----第二篇【原理】

    http://blog.csdn.net/deadgrape/article/details/50574459 接着上一篇,我们开始聊聊APPIUM的框架和运行模式.废话不多说直接上图. 1.首先自动 ...

  5. ASP.NET--identity笔记及截图

    aspnetUsers aspnetRoles aspnetUserroles aspnetUserClaims 存储用户user额外信息的键值对 aspnetUserLogins 第三方登陆的控件 ...

  6. 生成静态页java代码

    package com.fang.news.test; import java.io.BufferedReader; import java.io.BufferedWriter; import jav ...

  7. 应用市场快速下载以及网页端调起APP页面研究与实现

    Github博文地址,此处更新可能不是非常及时. 好久没写博客了,好大一个坑. 正好,近期刚做完应用市场的快速下载功能,便拿来填了这个坑. 话说产品为了添加用户量,提升用户活跃度以及配合推广,更坑爹的 ...

  8. CSDN--十年

    昨天获得了博客专家的勋章,惊喜总是来的有点意外.这个勋章也算是来的一波三折.借着这个机会,回首一下我在CSDN的博客历史. 这个博客如今可查的最早的文章,是04年下半年写的,事实上之前应该另一些自己写 ...

  9. Agile实践日志一 -- Grooming Session

    Agile实践日志一  -- Grooming Session GroomingSession 这个Session主要Go through我们下一个Sprint须要做的Story,大家都清楚之后,在每 ...

  10. 大型Web 站点 Asp.net Session过期你怎么办

    在 WEB 系统中. 我们通常会用session来保存一些简单可是却非常重要的信息.比方Asp.net中常常会用Session来保存用户登录信息,比方UserID.为了解决 WEB场大家採用了把ses ...