《匿名函数和闭包》 李炎恢老师视频摘记
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());