分享

Js函数闭包

 windli笔记 2014-11-03
(function(){
    var r, url;                   
    var s = location.href;
    url = /http:\/\/www.csdn.com.cn/i;          
    if(s.search(url)>=0){
      var head=document.getElementById("topHead");
      head.style.width="990px";
    }
  })
声明了一个匿名函数
加个()执行它

这种方式叫函数的闭包(closure),可以让匿名函数立即被执行(最后面的那对括号就是让上面定义的匿名函数立即执行的秘密),这种闭包有以下几个优势或特点:
1. 减少了全局变量的个数,可以有效减少命名冲突
   原因是包在里面的变量对于外面来说是不可见的,他们的作用域近局限在匿名函数的函数体内
2. 这种方式可以保存闭包外面的变量的状态,这个特点还是举个例子比较易懂:
JavaScript code?
1
2
3
4
5
6
7
8
9
10
11
12
function fn() {
    for(var i=0 ; i<2; i++) {
    //(function(){
        var backup = i;
        setTimeout(function() {
            alert(backup);
        }, 2000);
    //})();
    }
}
 
fn();

上面代码的for循环一共两次,我们本来的目的是每隔两秒钟把每一次循环的索引(也就是i)输出,我们期待它应该输出:0和1,但是实际输出结果却是两次都是1
使用了闭包之后,我们会把循环中每一次i值的状态都保存下来,如下代码所示:
JavaScript code?
1
2
3
4
5
6
7
8
9
10
11
12
function fn() {
    for(var i=0 ; i<2; i++) {
    (function(){
        var backup = i;
        setTimeout(function() {
            alert(backup);
        }, 2000);
    })();
    }
}
 
fn();

这次我们得到了正确的结果:0和1

因为闭包引用的是父函数范围内的最终值

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多