作用域、匿名函数、闭包

2016-10-10  本文已影响8人  Simon_s

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)
}
上一篇 下一篇

猜你喜欢

热点阅读