标签:
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里面的环境及变量会被一直保留在内存之中
关于闭包,作为前奏先叙述到这里
将会在正篇继续研究和讨论
标签:
原文地址:http://www.cnblogs.com/AlexNull/p/4778216.html