//普通函数 function box(){ return 'Lee'; } alert(box()); //匿名函数 function (){ //单独的匿名函数,是无法运行的 return 'Lee'; //就算能运行,也无法调用,因为没有名称 } //把匿名函数赋值给变量 var box = function(){ return 'Lee'; }; alert(box()); //通过自我执行来执行匿名函数 (function(){ alert('Lee'); })(); //把匿名函数自我执行的返回值赋值给变量 var box = (function(){return 'Lee';})(); alert(box); //自我执行匿名函数的传参 (function (age){ alert(age);})(100); //函数里放一个匿名函数 function box(){ return function(){ // 闭包 return 'Lee'; } } alert(box()()); //通过闭包返回局部变量 function box(){ var age = 100; return function(){ return age; } } alert(box()()); //使用全局变量进行累加 var age = 100; function box(){ age++; } alert(age); box(); alert(age); box(); alert(age); //使用匿名函数实现局部变量驻留内存中进行累加 function box(){ var age = 100; return function(){ age++; return age; } } alert(box()());//101 var b = box(); alert(b()); //101 alert(b()); //102 alert(b()); //103 b= null; //解除引用,等待垃圾回收 //循环里面的匿名函数的取值问题 function box(){ var arr=[]; for(var i=0; i<5; i++){ arr[i]=function(){ return i; }; } return arr; } //alert(box()[0]); var b = box(); for(var i=0; i<5; i++){ alert(b[i]()); //循环已经执行完毕了,i最终是4++=5,那么最终就是5 } //改0 function box(){ var arr=[]; for(var i=0; i<5; i++){ arr[i] = i; } return arr; } var b = box(); for(var i=0; i<5; i++){ alert(b[i]); } //改1 function box(){ var arr=[]; for(var i=0; i<5; i++){ arr[i] = (function(num){ return num; })(i); } return arr; } var b = box(); for(var i=0; i<5; i++){ alert(b[i]); } //改2 function box(){ var arr=[]; for(var i=0; i<5; i++){ arr[i] = (function(num){ return function(){ //因为闭包可以将变量驻留在内存中 return num; }; })(i); } return arr; } var b = box(); for(var i=0; i<5; i++){ alert(b[i]()); } //改3 function box(){ var arr=[]; for(var i=0; i<5; i++){ arr[i] = function(num){ //赋给一个变量的话,自我执行可以去掉圆括号 return function(){ //因为闭包可以将变量驻留在内存中 return num; }; }(i); } return arr; } var b = box(); for(var i=0; i<5; i++){ alert(b[i]()); } //关于this对象 var box ={ getThis:function(){ return function(){ return this; } } } alert(box.getThis()()); //返回[object Window] var user = 'the window'; var box = { user:'the box', getUser:function(){ return this.user; } } alert(box.getUser());//the box ---------------------------------------------- var user = 'the window'; var box = { user:'the box', getUser:function(){ //这里作用域的this是Box return function(){ //闭包在运行时时指向window的,因为闭包并不属于这个对象的属性或方法 //这里作用域的this是window return this.user; } } } alert(box.getUser()());//the window //对象冒充 alert(box.getUser().call(box));//the box var user = 'the window'; var box = { user:'the box', getUser:function(){ //这里作用域的this是Box var that = this; return function(){ //闭包在运行时时指向window的,因为闭包并不属于这个对象的属性或方法 //这里作用域的this是window return that.user; } } } alert(box.getUser()());//the box function box(){ var oDiv = document.getElementById('oDiv'); var text = oDiv.innerHTML; oDiv.onclick = function(){ alert(text); //oDiv用完之后一直驻留在内存中,这里用oDiv导致内存泄漏 } oDiv = null;//解除引用,等待垃圾回收 } box(); // 块级作用域(私有作用域) function box(){ for(var i=0;i<5;i++){ } alert(i); } box(); function box(count){ for(var i=0;i<count;i++){} var i; //就算重新声明,也不会覆盖前面的值 alert(i); } box(2); function box(){ (function(){ //包含自我执行的匿名函数,就可以实现私有作用域 for(var i=0;i<5;i++){ alert(i); } })(); //出了这个私有作用域,i被销毁了 alert(i); //这里就不认识i了 } box(); (function(){ //这里就是全局的私有作用域 var age = 100; alert(age); })(); alert(age); //age is not defined //私有变量 function box(){ var age = 100; //私有变量,外部无法访问 } function Box(){ this.age = 100; //属性,公有的 this.run = function(){ //方法,公有的 return '运行中...'; }; } var box = new Box(); alert(box.age); alert(box.run()) function Box(){ var age = 100; //私有变量 function run(){ //私有方法 return '运行中 ...'; } this.publicGo = function(){ //对外可见的公共接口,特权方法 return age + run(); }; this.getAge = function(){ return age; } } var box = new Box(); //alert(box.age); //undefined //alert(box.run()); //box.run is not a function alert(box.publicGo()); alert(box.getAge()); //通过构造函数传参 function Box(value){ var user = value; //私有变量 this.getUser = function(){ return user; }; this.setUser = function(value){ user = value; }; } var box = new Box('Lee'); alert(box.getUser()); box.setUser('ooo'); alert(box.getUser()); //静态属性 (function(){ var user=''; Box = function(value){ user = value; }; Box.prototype.getUser = function(){ return user; }; Box.prototype.setUser = function(value){ user = value; }; } )(); var box = new Box('Lee'); alert(box.getUser()); var box2 = new Box('KKK'); alert(box.getUser()); box2.setUser('ooo'); alert(box.getUser()); var box = function(){ var user = 'Lee'; //私有变量 function run(){ //私有函数 return '运行中...'; } return{ publicGo:function(){ return user + run(); //对外公共接口的特权方法 } }; }(); alert(box.publicGo()); var box = function(){ var user = 'Lee'; //私有变量 function run(){ //私有函数 return '运行中...'; } var obj={ publicGo:function(){ return user + run(); //对外公共接口的特权方法 } }; return obj; }(); alert(box.publicGo()); function Desk(){ } var box = function(){ var user = 'Lee'; //私有变量 function run(){ //私有函数 return '运行中...'; } var desk = new Desk(); desk.publicGo = function(){ return user + run(); }; return desk; }(); alert(box.publicGo());
Javascript匿名函数和闭包
猜你喜欢
转载自blog.csdn.net/fanrenxiaoshan/article/details/80689850
今日推荐
周排行