var arr = new Array();

function Person() {
for (var i = 0; i < 10; i++) { //要记住,这个属性函数申明,只有立即执行才会取scope属性
var item = function () {
return i;
}; arr.push(item);
}
} Person(); arr[0]();

这个代码执行person();首先完成初始化。注意因为i不是内部匿名函数的属性,所以i并没有当做匿名函数的属性来完成初始化。

然后执行arr[0]()。因为上面的缘故,执行匿名函数的时候回去Person()父级中查找变量i,因为这个时候初始化工作完成之后i=10了,所以最终输出的是10。而不是0。

如果我们想实现输出为0。那么我们必须这样:

var arr = new Array();

function Person() {
for (var i = 0; i < 10; i++) { //要记住,这个属性函数申明,只有立即执行才会取scope属性
var item = function (num) {
return num;
}(i);
arr.push(item);
}
} Person(); alert(arr[0]);

这样可与将i做为局部变量传递给匿名函数作为参数。另外,匿名函数item对于外界不再可见

为了更好滴理解,再举一个简单的例子:

function f(x) {
var g = function () { return ++x; };
return g;
} //函数返回的是函数g
var h = f(1); //变量h指向函数f的内部函数g,因此,函数f对象会一直保存在内存中,它的变量x当然也会保存在内存中。
alert(h());
alert(h());

这个分别输出2和3。不难理解:因为执行匿名函数g的时候会现在方法内部查找x,没有的话继续去f找x找到了。第一次自加=2。第二次自加=3。

打个不恰当的比喻:英格兰这是大不列颠帝国的一部分,那么如果英格兰的GDP总量增长了,那么对于大不列颠帝国的GDP总量肯定是有正相关的影响。

因为当函数f的内部函数g被函数f外的一个变量h引用的时候,就创建了一个闭包。这个时候x变量一直维持在内存中。而变量h是函数g本身(由此可见闭包可以让我们在函数的外部引用函数内部的函数)。所以多次执行h()实际上变量x做了累加。

而如果想剔除这个外部变量x对函数g的影响的话。就需要这么做:

function f(x) {
var g = function () { return ++x; }(x); //作用是创建了函数g的副本。
return g;
}//函数返回的是执行状态下的g
var h = f(1);
alert(h);
alert(h);

这个时候h实际上不是函数g本身了,而是处于调用状态下的g了(执行结果)。因此f函数内部的函数g是不可见的,无论变量h被引用多少回(都是在重复调用同一个执行结果),输出始终是2

再打个不恰当的比喻:如果这个时候英格兰闹独立了,并且最终页独立了。那么英格兰GDP的增长再也不会关大不列颠帝国什么事儿了(当然如果从哲学上来讲与一事物想联系的周围事物影响其发展)。

注:上面的变量h指向处于调用状态的函数g。也就是说f(1)相同于函数自动执行了。

如果想是某个函数自动执行就可以这么做。例如,我想让整个函数自动执行就如下即可:

(function f(x) {
var g = function () { return ++x; }(x);
return g;
})(1);

  

写得比较好的:http://www.jb51.net/article/24101.htm

http://web.jobbole.com/82053/

JavaScript备忘录-闭包的更多相关文章

  1. JavaScript备忘录-闭包(2)

    闭包的定义 闭包是指函数有自由独立的变量.换句话说,定义在闭包中的函数可以“记忆”它创建时候的环境. 闭包的浅显理解 function makeFunc() { var name = "Mo ...

  2. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  3. JavaScript作用域闭包简述

    JavaScript作用域闭包简述 作用域 技术一般水平有限,有什么错的地方,望大家指正. 作用域就是变量起作用的范围.作用域包括全局作用域,函数作用域以块级作用域,ES6中的let和const可以形 ...

  4. JavaScript的闭包原理

    什么是js(JavaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 个人的理解是 ...

  5. Js(javaScript)的闭包原理

    问题?什么是js(javaScript)的闭包原理,有什么作用? 一.定义 官方解释:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.  小编 ...

  6. 深入理解javascript的闭包

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域 ...

  7. 如何给循环中的对象添加事件--深入理解JavaScript的闭包特性

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  8. javascript,jquery(闭包概念)(转)

    偶尔听人说javascript闭包,让我联想起以前学编译原理和数字逻辑里讲的闭包,以前上课讲的闭包很难懂,而且含有递归的意思在里面,现在不想再查看里面的闭包概念. 但javascript我是经常要用, ...

  9. 理解Javascript 的闭包(closure)

    要理解闭包的概念先从变量的作用域说去 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之 ...

随机推荐

  1. NYOJ-171 聪明的kk AC 分类: NYOJ 2014-01-02 09:01 165人阅读 评论(0) 收藏

    #include<stdio.h> #define max(x,y) x>y?x:y int main(){ int num[22][22]={0}; int n,m; int x, ...

  2. .bash_profile备份

    # ~/.bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User sp ...

  3. hdu 1863 畅通工程(最小生成树,基础)

    题目 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<string.h> #include <ma ...

  4. Genymotion加载so出错解决方案

    通过网上所搜得出结论: Genymotion是x86的架构,而我们的so库是arm架构的 解决:安装Genymotion-ARM-Translation.zip 1.下载:http://pan.bai ...

  5. 分析windows宿主机Ping不通linux虚拟机的其中一种情况

    ping不通的情况是由于设置网络选项的时候,可以看到界面名称的选择如下(当前选择的是无线网卡驱动):

  6. Project Euler 80:Square root digital expansion 平方根数字展开

    Square root digital expansion It is well known that if the square root of a natural number is not an ...

  7. leetcode 4 : Median of Two Sorted Arrays 找出两个数组的中位数

    题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...

  8. HTML5入门4---HTML5 与 HTML4 同一网页的不同写法

    HTML4写法 css: body { font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana ...

  9. 如何在Android应用程序中使用传感器模拟器SensorSimulator

    原文地址; 如何在Android应用程序中使用传感器模拟器 - 移动平台应用软件开发技术 - 博客频道 - CSDN.NET http://blog.csdn.net/pku_android/arti ...

  10. CMake with Win&MinGW

    今天一个下午都在做一件简直耻辱play的事情,论文没看,程序没写,玩了一个下午的编译器...心塞(逃... 言归正传,今天要讲在windows下,使用Cmake和MInGW. 1.g++ MinGW的 ...