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/

最新文章

  1. IFC格式简介
  2. kruskal --- C++
  3. I.MX6 lcd lvds hdmi bootargs
  4. HDU4648+Easy
  5. iOS XMPP之常见错误一:(&lt;failure xmlns=&quot;urn:ietf:params:xml:ns:xmpp-sasl&quot;&gt;&lt;not-authorized/&gt;&lt;/failure&gt;)
  6. C#调用百度地图API
  7. 201521123081《Java程序设计》 第3周学习总结
  8. 解决Ajax请求时无法重定向的问题
  9. Batch入门教程丨第一章:部署与Hello World!(下)
  10. opencv coudn&#39;t find video stream from &quot;XXX(文件名)&quot;
  11. 【Noip模拟 20161005】运货
  12. java struts2入门学习---异常处理和类型转换
  13. MySql(十七):MySql架构设计——高可用设计之思路及方案
  14. 原:Myeclipse10+Egit+bitbucket实现版本控制
  15. imageView 的contentMode问题
  16. Mysql 练习题一
  17. Linux(Contos7.5)环境搭建之Gitblit安装(三)
  18. Java初学者笔记五:泛型处理
  19. 一个servlet如何处理多个请求
  20. element自定义表单验证

热门文章

  1. 使用shell脚本获取虚拟机中cpu使用率(读/proc/statc)
  2. POJ 2912 Rochambeau(难,好题,枚举+带权并查集)
  3. hdu1068 Girls and Boys
  4. 1051 Wooden Sticks
  5. Sina App Engine(SAE)入门教程(1)
  6. Java开发--操作MongoDB
  7. SSL/TLS/WTLS原理(密钥协商的形象化比喻:验证服务器的身份,用服务器的公钥协商加密格式,然后再加密具体的消息,TCP传递SSL处理后的数据)good
  8. Could not connect to SMTP host: smtp.***.com, port: 465, response: -1
  9. pancake sort的几个问题
  10. 机器学习 —— 概率图模型(Homework: Representation)