《匿名函数和闭包》 李炎恢老师视频摘记

  1 //普通函数  
  2 function box(){  //函数名称
  3     return "LEE";
  4 };
  5 alert(box());        //执行
  6 
  7 -----------------------------------------------------
  8 //匿名函数
  9 function (){ //单独的匿名函数无法执行 就算能运行也无法调用
 10     return "LEE";
 11 }
 12 
 13 -----------------------------------------------------
 14 //把匿名函数赋值给变量box
 15 var box=function (){
 16     return "LEE";
 17 };
 18 alert(box()); //box() 表示立即执行
 19 
 20 -----------------------------------------------------
 21 //通过表示式自我执行
 22 (function(){      //封装成表达式
 23     alert ("Lee");
 24 })();   // ()表示执行函数,并且传参
 25 
 26 -----------------------------------------------------
 27 //把匿名函数自我执行的返回值赋值给box
 28 var box=(function(){
 29     return "LEE";
 30 })();
 31 alert(box);
 32 -----------------------------------------------------
 33 //匿名自我执行后,在alert( )打印
 34 alert((function(){
 35     return "LEE";
 36 })());
 37 
 38 -----------------------------------------------------
 39 (function(age){    //单一的匿名函数传参
 40     alert(age);
 41 })(100);
 42 
 43 -----------------------------------------------------
 44 function box(){  //函数里放一个匿名函数
 45     return function (){  //产生一个闭包
 46         return "LEE"
 47     }
 48 }
 49 alert(box()());  //打印出最里面的return
 50 /*alert(box)
 51 输出 function box() {
 52     return function () {return "LEE";};
 53 }
 54 */
 55 /*alert(box())
 56 输出function () {
 57     return "LEE";
 58 }
 59 -----------------------------------------------------
 60 function box(){  //函数里放一个匿名函数
 61     return function (){  //产生一个闭包
 62         return "LEE"
 63     }
 64 }
 65 var b=box(); //通过赋值给b,在输出闭包中的内容
 66 alert(b());
 67 --------------------------------------------------------
 68 
 69 //通过闭包返回局部变量
 70 function box(){
 71     var age=100;
 72     return function(){
 73         return age;
 74     };
 75 };
 76 alert(box()());
 77 ----------------------------------------------------------
 78 //普通函数的递增
 79 var age=100;
 80 function box(){
 81     age++;
 82     return age;
 83 }
 84 alert(box());         //101
 85 alert(box());        //102
 86 ------------------------------------------------------------
 87 //使用匿名函数实现局部变量驻留内存中从而累加
 88 function box(){
 89     var age=100;
 90     return function(){
 91         age++;
 92         return age;
 93     };
 94 };
 95 var b=box(); //从匿名函数开始执行
 96 alert(b());
 97 b=null;//解除引用 等待垃圾回收
 98 alert(b());//已经消失
 99 
100 -----------------------------------------------------------
101 -----------------------------------------------------------
102 
103 function box(){
104     var arr=[];
105     
106     for (var i=0;i<5;i++){    //arr[0]=0....
107         arr[i]=function(){
108             return i;
109         };
110     }
111     //循环完毕 i最终是4,i++等于5 
112     return arr;
113 }
114 //alert(box());//返回一个数组
115 //alert(box()[0]);//返回第一个
116 var b=box();
117 for(var i=0;i<5;i++){  //返回五次的意思
118     alert(b[i]());
119 //调用匿名函数的i
120 //返回闭包里的值 为5 循环结束
121 }
122 
123 -----------------------------------------------------------
124 //改0
125 function box(){
126     var arr=[];
127     for (var i=0;i<5;i++){
128         arr[i]=i;
129     }
130     return arr;
131 }
132 var b=box();
133 alert(b); //0,1,2,3,4
134 for(var i=0;i<5;i++){//    循环
135 alert(b[i]);
136 }
137 --------------------------------------------------------
138 --------------------------------------------------------
139 //改1
140 function box(){
141     var arr=[];
142     for (var i=0;i<5;i++){
143         arr[i]=(function(num){ // 通过自我及时执行匿名函数
144             return num;
145         })(i);
146     }
147     return arr;
148 }
149 var b=box();
150 for (var i=0;i<5;i++){//    循环
151 alert(b[i]);
152 }
153 --------------------------------------------
154 //改2
155 function box(){
156     var arr=[];
157     for (var i=0;i<5;i++){
158         arr[i]=(function(num){   //再来一个闭包
159             return function(){
160                 return num;
161             };
162         })(i);
163     }
164     return arr;
165 }
166 var b=box();
167 for (var i=0;i<5;i++){
168 alert(b[i]());
169 }
170 
171 
172 ===================================
173 ------------------------------------------------------------
174 this对象的指向
175 
176 var box={
177     getThis:function(){
178         return function(){  //return一个闭包
179             return this;
180         }
181     }
182 };
183 alert(this); //全局变量
184 alert(box.getThis()());//执行闭包,指向全局
185 
186 
187 var user="the window";
188 var box={
189     user:"the box",
190     getUser:function (){
191         //这里作用域的this是Box
192         return function(){
193         //这里作用域的this是window                
194             return this.user
195         }; 
196     }
197 };
198 alert(box.getUser());  //没有闭包时指向"the box"
199 alert(box.getUser()());  //有闭包指向全局"the window"
200 alert(box.getUser().call(box));//对象冒充"the box"
201 
202 
203 var user="the window";
204 
205 var box={
206     user:"the box",
207     getUser:function (){
208         var that=this;
209         //这里作用域的this是Box
210         return function(){
211         //这里作用域的this是window                
212             return that.user
213         }; 
214     }
215 };
216 alert(box.getUser()()); //the box
217 
218 -----------------------------------------------------------
219 -----------------------------------------------------------
220 私有变量 作用域
221 
222 function box(){
223     age=100;
224 }
225 alert(box())  //无法找到 因为是私有变量
226 
227 function Box(){    //构造函数
228     this.age=100;  //属性 公有的
229     this.run=function (){    //方法 公有的
230         return "运行中";
231     }
232 }
233 var box=new Box;
234 alert(box.age);  
235 alert(box.run());
236 
237 
238 特权方法
239 function Box(){    //构造函数
240     var age=100;  //私有变量
241     function run(){    
242         return "运行中";
243     }
244 
245 //在同一个作用域下
246     this.publicGo=function(){    //对外可见的公共接口,特权方法
247         return age+run();
248     }
249     this.getPublicGo=function(){    //对外可见的公共接口,特权方法
250         return age;
251     }    
252 }
253 var box=new Box;
254 alert(box.publicGo());  
255 alert(box.getPublicGo());  
256 
257 //通过构造函数传参
258 
259 function Box(value){
260     var user=value;    //私有变量
261     this.getUser=function(){     //公共接口
262         return user;
263     };
264 }
265 var box= new Box("Kee");
266 alert(box.getUser());
267 
268 
269 静态私有变量
270 (function(){   //自我执行
271     var user=""        //私有变量
272     Box=function(value){        //    Box等于全局,构造函数传参并赋值给Box 
273         user=value;
274     };
275     Box.prototype.getUser=function(){ //公共接口 使用原型
276         return user;
277     };
278     Box.prototype.setUser=function(value){ //公共接口 使用原型
279         user=value;
280     };    
281 })()
282 var box=new Box("LEE");  //第一次实例化
283 alert(box.getUser());
284 var box2=new Box("HHH");
285 alert(box.getUser());
286 box2.setUser("GGG"); //改变  静态私有变量
287 alert(box.getUser());
288 
289 alert(box.getUser()); //"GGG"  已经被共享
290 
291 
292 Box=function(){}是全局
293 
294 
295 var box=(function(){ //使用对象可以省去()() 模式的一对括号  单例模式
296     var user="LEE";
297     function run(){
298         return "运行中";
299     }
300     
301     var obj={                            //对外可见的公共接口,特权方法
302         publicGo:function (){
303             return user+run();
304         }
305     };
306     return obj;
307 })();
308 alert(box.publicGo());

 

posted @ 2015-06-10 13:22  hutaotaotao  阅读(219)  评论(0编辑  收藏  举报