码迷,mamicode.com
首页 > Web开发 > 详细

js:匿名函数/闭包前奏

时间:2015-09-02 13:21:50      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:

js里面”万物皆对象“,函数同理

三种定义方式

a.传统的如同C语言一样的定义方式:function abc(){code}

b.少见的定义方式:var abc = new Function(‘参数‘,‘代码‘);  //由此可见我们的function是构造函数Function的对象实例,即函数也是对象 

c.匿名函数定义:var abc = function(){...} //写一个匿名函数,并让一个变量称为它的引用

 

对于匿名函数有很多奇技淫巧:

1.若是我们平时用a,b方法定义函数,实际调用的时候需在函数名后+()并写入参数,如abc(),abc(a)..这基础、浅显但是重要

2.直接用匿名函数不赋值,(function(...){....})(实参);

3.也就是你平常写个匿名函数function(){}它是不会执行的,它只相当于一个函数名

4.然后来了一堆乱七八糟的写法是和2等效的

~(function(){...})(); //返回-1

void function(){...}();  //返回undefined

+/- function(){...}(); //返回NaN

~function(){...}(); //返回-1

!function(){...}(); //返回true

(function(){...}()); //undefinded

你不知道哪些混蛋会突然这样写代码,尤其在闭包问题上,见识过总是好的

 

闭包前奏

有个例子被人举烂了

但是我们有大多碰到过这种情况,至少我碰到过

for(var i=1;i<=5;i++){

  setTimeout(function(){alert(i)},i*1000);

}

这样会输出5次"6"

然后很基本大家都知道

for(var i=1;i<=5;i++){

  setTimeout((function(){alert(i)})(i),i*1000);

}

就好了,

会依次输出各位数字

然后很多人说:“这就是闭包”

wtf?这真的是闭包?

按照上一篇关于reference value 和 primitive value的解释

和之前我们对匿名函数的认识

就足够解释这一现象了,不需要闭包知识

 

由于alert是延迟执行的,按照第一种写法,哪怕只有1000ms,i已经变成6了

按照第二种写法会得到我们预期的效果是因为

在这个匿名函数后面加了(),

相当于在往setTimeout里放fallback函数时,

就执行了一次匿名函数

i是primitive value

函数传参的形式把当时的i值复制了份传了进去

这和闭包并没有太大的关系

 

抛开学术用语,我个人目前浅表的理解是这样

“如果一个func 里面的 innerFunc 被作为返回值”

则称之为闭包

这样func里面的环境及变量会被一直保留在内存之中

关于闭包,作为前奏先叙述到这里

将会在正篇继续研究和讨论

 

js:匿名函数/闭包前奏

标签:

原文地址:http://www.cnblogs.com/AlexNull/p/4778216.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!