美文网首页
作用域、匿名函数、闭包

作用域、匿名函数、闭包

作者: Simon_s | 来源:发表于2016-10-10 21:18 被阅读8次

    1、//作用域的概念

    //作用域:变量的生效范围,如果变量在整个页面中都可以访问到,则该变量就是一个全
    局变量;如果变量的有效范围只是在某一个范围内,该变量就是一个局部变量。
    
    //在函数内部,使用var定义的变量是局部变量,除此以外,都是全局变量。没用用var定义的变量,则是一个全局变量
    
    
                
    
        
    //      var a = 12;
    //      function useA () {
    // 因为在内部作用域中使用到了和外部作用域同名的变量,所以需要先判断内部有没有重
    新定义这个变量,(1):如果重新定义了,那么就是用新定义的这个变量,(2):如 果没有,则该变量就是外部作用域中的变量
    
    //          alert(a); // undefine
    //          var a = 24;
    //          
    //          return a;
    //      }
    //      
    //      alert(a); // 12
    //      alert( useA() );  // 24
    //      
    //      alert(a);  // 12
    
    
    
    function demoFun () {
    alert(e);
    }
    
    
    
    
    demoFun();
    
      var e = 23;
    
    
    function demoFun1 () {
    alert(e);
    }
    
    demoFun1();
    

    2、 //匿名函数

    //具名函数:有函数名,可以通过函数名来调用
    //匿名函数:没有函数名,可以通过事件来调用,变量调用,自调用;
    var a = function(){
    alert("hello world")
    };
    
    (function (a){alert("goodbye world"+a)})("sdfds");
    
    //给事件添加匿名函数
    //匿名函数可以当做参数传递
    setInterval(function(){
    alert("fdsds")
    },1000)
    
    //匿名函数可以当做返回值
    

    3、//闭包

    //可以通过闭包在外部访问局部变量
    //凡是放在返回函数中的变量会被提升为全局变量,驻留在内存中不释放
    function f1(){
    var n = 999;
    nAdd = function(){n+=1};
    function f2(){
        alert(n)
    }
    return f2;
    }
    
    var result = f1();
    nAdd();
    result();
    
    
    
    
    //使用闭包的思路解决循环添加事件的Bug
    //定义一个属性存储每次循环的i的值
    /*for(var i=1;i<4;i++){
    var btn = document.getElementById("button"+i)
    btn.tempNumber = i
    btn.onclick=function(){
        alert("button"+this.tempNumber)
    }
    }*/
    

    4、//用闭包解决

    for(var i=1;i<4;i++){
    var btn = document.getElementById("button"+i);
    //alert(btn)
    (function(num){
        btn.onclick=function(){
            alert("button"+num)
        }
    })(i)
    }

    相关文章

      网友评论

          本文标题:作用域、匿名函数、闭包

          本文链接:https://www.haomeiwen.com/subject/oaevyttx.html