1.匿名函数
通过自我执行来执行匿名函数
1 (function(){...})() // 前面小括号是匿名函数,后面小括号是执行
函数里面放一个匿名函数
1 function box(){ 2 return function(){ 3 return 'haha'; 4 } 5 } 6 var b = box(); 7 alert(b())
// alert(box()()) 不建议这么写
闭包
定义:有权访问另一个函数作用域中的变量的函数(在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量)
1. 使用匿名函数实现局部变量驻留内存中从而累加
1 function box(){ 2 var age = 100; 3 return function(){ 4 age++; 5 return age; 6 } 7 } 8 var b = box(); 9 aler(b()); 10 aler(b()); 11 aler(b()); 12 aler(b());
b = null // 解除引用,等待垃圾回收
ps:由于闭包作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更多的内存。过度使用闭包会导致性能下降,建议在非常必要的时候使用闭包
2.
1 function box(){ 2 var arr = []; 3 for(var i = 0; i < 5; i++){ 4 arr[i] = (function(num){ 5 return function(){ 6 return num; 7 } 8 })(i); // 及时执行自己 9 } 10 return arr; 11 } 12 var b = box(); 13 for(var i = 0; i < 5; i++){ 14 alert(b[i]( )); 15 }
3.关于this对象(闭包不属于object,this指向window)
1 var user = 'window' 2 var box = { 3 user: 'box', 4 getUser: function(){ 5 var that = this; 6 return function(){ 7 // return this; 8 return that.user; 9 } 10 } 11 } 12 // alert(box.getUser()()); // 指向window对象 13 // alert(box.getUser().call(box)); // call,通过对象冒充指向box 14 alert(box.getUser()())
4.块级作用域(私有作用域)
1 function box(){ 2 (function(){ // 包含自我执行的匿名函数,就可以实现私有作用域 3 for(var i = 0;i<6;i++){ 4 alert(i); 5 } 6 })(); // 出了这个私有作用域,变量就会被销毁 7 alert(i); // 这里就不认识了 8 9 } 10 box();
5.通过原型创建共享
(function(){ var user = ''; Box = function(value){ // 全局,构造函数 user = value; } Box.prototype.getUser = function() { // 通过原型创建一个共享地址 return user; }; })(); var box = new Box('lee'); alert(box.getUser()); // lee var box2 = new Box('kkk'); alert(box.getUser()) // kkk
6.单例
var box = { // 只实例化一次,那么就是单例 user: 'lee', run: function(){ return 'hahhaha'; } }
7.字面量的方式
var box = function(){ var age = 100; function run(){ return '运行中'; } // 第一种方法 // return{ // 直接返回对象 // go: function(){ // return age+run(); // } // } // 第二种方法 var obj = { go: function(){ return age + run(); } } return obj; }(); alert(box.go());
8.增强的模块模式,适合返回自定义对象,也就是构造函数
function Desk(){} var box = function(){ var age = 100; // 私有变量 function run(){ // 私有函数 return '运行了'; } var obj = new Desk(); obj.publicGo = function(){ // 也可以将其封装在Desk里面 return age + run(); } return obj; }() alert(box.publicGo())