JS闭包(closure)一个应用示例

来源:互联网 发布:苹果电脑装机软件 编辑:程序博客网 时间:2024/05/17 08:24

在自己用js闭包前其实也没有太懂为啥要用闭包。前几天碰到了一个问题,用闭包解决了。背景是我不停地要向不同的ip发两条命令,两条命令之间相隔100ms发送。
最早的程序大概类似这样:

var ip = 1;var port = 2;function aaa(ip, port){    console.log(ip);    console.log(port);}aaa(ip, port)setTimeout(function(){aaa(ip, port)}, 100)//第二条命令还发出去,目标ip和port已经变了ip = 4;port = 6;

开始我以为运行结果会是1,2,1,2,因为我觉得在设定timeout的时候ip和port是1,2,在执行时也应该是1,2。其实发现是1,2,4,6。
后来把程序改成了这样:

var ip = 1;var port = 2;function bbb(ip, port){    aaa(ip, port)    setTimeout(function(){aaa(ip, port)}, 100)    function aaa(ip, port){        console.log(ip);        console.log(port);    }}bbb(ip, port)ip = 4;port = 6;

搞定了。返回头看,这就是闭包。w3c对闭包的解释:A closure is a function having access to the parent scope, even after the parent function has closed.在timeout执行aaa时,bbb已经结束了,但是其参数依然有效。