JS 闭包随笔 欢迎大家斧正

ws_hgo 2011-10-21 01:43:59
加精
概念:
封闭了外部函数作用域中变量的内部函数,并且返回该内部函数,该变量称为自由变量,也可以叫做闭包变量. 即便返回该外部函数,由于内部函数的间接引用该变量,当GC检查没有相关对象引用它时,就会释放该资源.

//(1)
         function (n) {
             alert(n);
         } (3); //没有效果
         //(2)
         (function (n) {
             alert(n);
         })(3); //会弹出3
         //(3)
         var b = function (n) {
             alert(n);
         } (3); //也会弹出3
         //(4)
         var b1 = function (n) {
             alert(n);
         }
         b1(3); //也会弹出3
         /*从上面代码中我可以得出
         1.(1)和(2)的区别在于(1)没有执行,(2)执行啦
         2.()表示让匿名函数立刻执行
         */


/*
通过下面代码Result1和Result2输出的结果分别是什么了.
结果肯定是不一样的
Method1:输出的是:1-9
Method2:输出的是:9个10
为什么会这样了.
你可以考虑刚才的开胃小菜中的Demo.
下面我们来看下Method1中的
(function (m) {
return m;
})(i);
这个匿名函数返回的是经过运算结果的值,然后赋给数组
接下来我们看下Method2中的
array[j] = function () {
return j;
};
此时数组获取的时该函数的引用,该函数并没有执行
*/
function CreateArray1() {
var array = new Array();
for (var i = 0; i < 10; i++) {
//区别
array[i] = (function (m) {
return m;
})(i);
}
return array;
}
var results1 = CreateArray1();
document.write("Method1 Results:<br/>");
for (var i = 0; i < results1.length; i++) {
document.write(results1[i]+"<br/>");
}
document.write("------------------------<br/>");
document.write("Method2 Results:<br/>");
function CreateArray2() {
var array = new Array();
for (var j = 0; j < 10; j++) {
//区别
array[j] = function () {
return j;
};
}
return array;
}
var results2 = CreateArray2();
for (var i = 0; i < results2.length; i++) {
document.write(results2[i]() + "<br/>");
}



<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript">
/*
当我点击例子1,例子2,例子3的时候 分别弹出1,2,3
代码如下:
但是下面的代码没有得到我想要的效果,而是点击所有的"例子"都是4.
这个原因就是闭包造成的.每个点击onclick引用的函数都是alert()
当真个循环结束的时候,alert()函数返回的值是最大值.
怎么解决这个问题了
看func2()
//怎么理解这个话(function (n) { return function () { alert(n) }; })(v);
立刻执行当前函数,当前例子onclick引用的函数就是function () { alert(n) },n的值就是当前v的值
*/
function func1() {
var v;
for (var i = 1; i < 5; i++) {
v = i;
document.getElementById('closureExample' + v).onclick = function () { alert(v) };
}
}
function func2() {
var v;
for (var i = 1; i < 5; i++) {
v = i;
document.getElementById('closureExample' + v).onclick = (function (n) { return function () { alert(n) }; })(v);
}
}
window.onload = function () {
//func1();
func2();
}
</script>
</head>
<body>
<a href="#" id="closureExample1">例子1</a>
<a href="#" id="closureExample2">例子2</a>
<a href="#" id="closureExample3">例子3</a>
<a href="#" id="closureExample4">例子4</a>
</body>
</html>
...全文
7180 92 打赏 收藏 转发到动态 举报
写回复
用AI写文章
92 条回复
切换为时间正序
请发表友善的回复…
发表回复
young_link 2013-10-03
  • 打赏
  • 举报
回复
有帮助!!! 谢谢!!!
ws_hgo 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 86 楼 liangws 的回复:]

引用 85 楼 bigwatercar 的回复:
封闭了外部函数作用域中变量的内部函数,并且返回该内部函数,该变量称为自由变量,也可以叫做闭包变量. 即便返回该外部函数,由于内部函数的间接引用该变量,当GC检查没有相关对象引用它时,就会释放该资源.

能详细解释下GC不?


GC是指垃圾回收,引擎会定时查找没有被其他地方引用的变量,将其销毁,内存释放
[/Quote]

关于JS GC 这块 我没有研究.
墨子Zhai 2011-10-31
  • 打赏
  • 举报
回复
哥,你这代码书写,太初级了。
应该搞得专业一些,
1、看看雅虎34法则中关于js的论述。

2、给你几个例子看看: http://my.oschina.net/u/150089/codelist
随风丶 2011-10-27
  • 打赏
  • 举报
回复
真有点晕,有点太麻烦了吧~
liangws 2011-10-27
  • 打赏
  • 举报
回复
[Quote=引用 85 楼 bigwatercar 的回复:]
封闭了外部函数作用域中变量的内部函数,并且返回该内部函数,该变量称为自由变量,也可以叫做闭包变量. 即便返回该外部函数,由于内部函数的间接引用该变量,当GC检查没有相关对象引用它时,就会释放该资源.

能详细解释下GC不?
[/Quote]

GC是指垃圾回收,引擎会定时查找没有被其他地方引用的变量,将其销毁,内存释放
  • 打赏
  • 举报
回复
封闭了外部函数作用域中变量的内部函数,并且返回该内部函数,该变量称为自由变量,也可以叫做闭包变量. 即便返回该外部函数,由于内部函数的间接引用该变量,当GC检查没有相关对象引用它时,就会释放该资源.

能详细解释下GC不?
  • 打赏
  • 举报
回复
(ucType & FH_DII_MASK) & FH_DII_DATA
kelvin_yuwenjing 2011-10-27
  • 打赏
  • 举报
回复
学习学习了。。。。。。。。。。
zengtan1021 2011-10-27
  • 打赏
  • 举报
回复
function (n) {
alert(n);
} (3)
语法错误, 函数声明不能被执行 。


(function (n) {
alert(n);
}) (3)
ok, 函数声明被括号运算符强制转化成表达式. 可以执行.
李睿_Lee 2011-10-27
  • 打赏
  • 举报
回复
看得有点迷糊。。。
qwer1234000123 2011-10-26
  • 打赏
  • 举报
回复
当我点击例子1,例子2,例子3的时候 分别弹出1,2,3
代码如下:
但是下面的代码没有得到我想要的效果,而是点击所有的"例子"都是4.
这个原因就是闭包造成的.每个点击onclick引用的函数都是alert()
当真个循环结束的时候,alert()函数返回的值是最大值.
怎么解决这个问题了
看func2()
//怎么理解这个话www.105h.com(function (n) { return function () { alert(n) }; })(v);
立刻执行当前函数,当前例子onclick引用的函数就是function () { alert(n) },n的值就是当前v的值
*/
function func1() {
var v;
for (var i = 1; i < 5; i++) {
v = i;
阿星777 2011-10-26
  • 打赏
  • 举报
回复
//(1)
function (n) {
alert(n);
} (3); //没有效果

这个在IE9和FF6中都是不能运行的,是语法错误吧.
jim-single 2011-10-26
  • 打赏
  • 举报
回复
看标题,我都晕了‘
阿星777 2011-10-26
  • 打赏
  • 举报
回复
看得好晕~~,不过很受教!
秋风落地 2011-10-26
  • 打赏
  • 举报
回复
谢谢楼主,学习了
秋风落地 2011-10-26
  • 打赏
  • 举报
回复
谢谢楼主,学习了
yueyou0514 2011-10-26
  • 打赏
  • 举报
回复
晕啊,学习
blueskywyf 2011-10-26
  • 打赏
  • 举报
回复
不错,学习了
lpp1990520 2011-10-26
  • 打赏
  • 举报
回复
爱爱爱
lpp1990520 2011-10-26
  • 打赏
  • 举报
回复
没有积分?
加载更多回复(67)

87,904

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧