js:闭包
var getNum;
function getCounter() {
var n = 1;
var inner = function () {return n++; }
console.log(n);
return inner;
}
//第一步
getNum = getCounter();
//第二步
console.log(getNum());//1
//第三步
console.log(getNum());//2

//也许是这样?可能的情况1:
//第一步 getNum指向了getCounter函数的返回值,即inner函数,此时inner内的n调用的是上级函数的n,
但是没有执行,所以此时n是1,而且由于他调用的是上级函数的变量,此时inner的n突破了作用域,n=1写入到了内存中,可以以后进行调用
//第二步 执行getNum函数,也就是执行了inner函数,inner函数此时返回n++,也就是 1++ 返回了1,执行后n现在等于2了
//第三部 同上返回2,执行后n等于3
 

//或者是这样?可能的情况2:
//第一步 getNum指向了getCounter函数的返回值,即inner函数
//第二步 执行了getNum函数,也就是执行了inner函数,由于他在一个高阶函数getCounter内部,
他可以使用高阶函数内的变量n,由于inner函数被return,此时n实现了越狱,n=1写入到了内存中,可以以后进行调用,此时输出1,n++后n=2
//第三步 由于n实现了越狱,输出2,n++后n=3

//n不是全局变量,只能在inner内使用
 
//20170714_10:36更新,情况1是错误的
//第一步getNum被赋值时,inner并没有被执行,
//第二步inner执行时调用了上级函数的变量n,n最终值为1,故此时n为1然后再++,
//第三步inner查找n时n=2,然后n++,
//如果此时调用getCounter()的话.n重新被赋值为1.划重点→但是!inner里面的n不会被覆盖为1,这个inner里面的n取得于getCounter,运行于inner,不被外部函数重写,只能在自己函数的作用域内进行操作!
 
这个又涉及到了函数初始化和函数运行的问题 举个栗子
function createFunctions(){
var result = new Array();
for (var i=0; i < 10; i++){
result[i] = function(){
return i;
};
}
return result;
}
var funcs = createFunctions();
for (var i=0; i < funcs.length; i++){
console.log(funcs[i]());
}
 
//密集地雷预警
//这里输出的是10个10
//第一步creatFunctions执行后,返回的是result,返回前执行了10次for循环,对result进行赋值,result[0]=function(){return i;(此时i=0)}; ... result[9]=function(){return i;(此时i=9)};
i=9循环完成后继续for循环,此时(i=10;i<9;i++)不成立结束了for循环,也就是说creatFunctions里最终情况i=10.
//第二步for循环了funcs.length次,funcs是数组,长度为10,然后输出funcs[i](),这里有()表示执行,也就是funcs[0]()...funcs[9],看样子要返回0..9了,
然后return i;然而此时匿名函数里的i是10,也就是return 10;了10次!!!
 
20170714_11:34再更 ↑面的感觉还是有点错误
 
result[i] = function(){
return i;
}
//chrome调试时图片↓
//执行到funcs[2]时i=2,funcs[2] = function(){return i;}; 此时i=2,此时funcs[2]()并没有运行,只是显示了funcs[2]
 
 
//执行到funcs[2]()时,匿名函数被运行了,i=2被匿名函数存储的i=10覆盖,然后return i;时return了10!!!
//这次没问题了,李菊福!!!
 
 
 
 
参考文档:
①图解JS闭包 https://zhuanlan.zhihu.com/p/27857268
②JavaScript之作用域与闭包详解http://www.cnblogs.com/syfwhu/p/4839562.html
③一分钟理解js闭包_javascript技巧http://www.jb51.net/article/83524.htm
④变量作用域http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014344993159773a464f34e1724700a6d5dd9e235ceb7c000

20170713_js闭包/匿名函数/作用域的更多相关文章

  1. PHP闭包--匿名函数

    匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值.当然,也有其它应用的情况. ...

  2. php Closure类 闭包 匿名函数

    php匿名函数 匿名函数就是没有名称的函数.匿名函数可以赋值给变量,还能像其他任何PHP对象那样传递.不过匿名函数仍是函数,因此可以调用,还可以传入参数.匿名函数特别适合作为函数或方法的回调. 如: ...

  3. ptyhon 编程基础之函数篇(二)-----返回函数,自定义排序函数,闭包,匿名函数

    一.自定义排序函数 在Python中可以使用内置函数sorted(list)进行排序: 结果如下图所示: 但sorted也是一个高阶函数,可以接受两个参数来实现自定义排序函数,第一个参数为要排序的集合 ...

  4. 【Python】闭包 & 匿名函数

    闭包 1.注意:返回的函数内部不要使用后续会发生变化的变量. def f(): gs = [] for k in range(1, 4): def g(i): return i + k gs.appe ...

  5. 对JS闭包和函数作用域的问题的深入讨论,如何理解JS闭包和函数作用域链?

    首先先引用<JavaScript权威指南>里面的一句话来开始我的博客:函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 因此,就出现了如下的几串代码: ...

  6. Lambda 闭包 匿名 函数 类

    深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法) - _Luc_ - 博客园 https://www.cnblogs.com/figure9/p/java-8 ...

  7. JavaScript 闭包系列二(匿名函数及函数的闭包)

    一. 匿名函数 1. 函数的定义,可分为三种 1) 函数声明方式 function double(x) {     return 2*x; } 2)Function构造函数,把参数列表和函数体都作为字 ...

  8. 第一百一十节,JavaScript匿名函数和闭包

    JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...

  9. JavaScript(第十五天)【匿名函数和闭包】

      学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...

随机推荐

  1. spring-boot开发:使用内嵌容器进行快速开发及测试

    一.简述一下spring-boot微框架 1.spring-boot微框架是什么? 大家都知道,在使用spring框架进行应用开发时需要很多*.xml的初始化配置文件,而springBoot就是用来简 ...

  2. linux-ubuntu下fastQC的安装

    1.fastqc是在Java环境下运行的:所以在安装fastqc之前,Linux下要有相应的Java运行环境(JRE).且java的版本应该在1.8.0版以上 2.java的安装:下载最新版本的Jav ...

  3. html5shiv.min.js 和 respond.min.js 作用(bootstrap做IE低版本兼容时需要用到这两个插件)

    1. html5shiv.min.js解决ie9以下浏览器对html5新增标签的不识别,并导致CSS不起作用的问题. respond.min.js让不支持css3 Media Query的浏览器包括I ...

  4. js继承的常用方法

    写在前面的话:这篇博客不适合对面向对象一无所知的人,如果你连_proto_.prototype...都不是很了解的话,建议还是先去了解一下JavaScript面向对象的基础知识,毕竟胖子不是一口吃成的 ...

  5. 【Appnium+C#+Winform自动化测试系列】前言

    目录(后期持续更新) 一.前言  1.为什么选择Appnium 最近这些年APP保持着持续的火热,对应的APP测试行业也是跟着水涨船高.由于市场的需求,APP测试平台也涌出大量的自动化测试工具. 在对 ...

  6. 转化来的图标用法symbol引用‘font-class引用及Unicode引用

  7. 自定义分布式RESTful API鉴权机制

    微软利用OAuth2为RESTful API提供了完整的鉴权机制,但是可能微软保姆做的太完整了,在这个机制中指定了数据持久化的方法是用EF,而且对于用户.权限等已经进行了封装,对于系统中已经有了自己的 ...

  8. Treasure Hunt

    Treasure Hunt time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  9. vue中数据双向绑定注意点

    最近一个vue和element的项目中遇到了一个问题: 动态生成的对象进行双向绑定是失败 直接贴代码: <el-form :model="addClass" :rules=& ...

  10. Java学习笔记--异常描述

    异常描述 1.简介 为了全面了解"异常"的概念,先来分析一个实例.假定要编写一个Java程序,该程序读取用户输入的一行文本,并在终端显示该文本.这里是一个演示Java语言I/O功能 ...