JS-IIFE&闭包
IIFE(当即调用函数表达式)
示例
(function iife(){ //直接执行,无需调用 console.log("hello"); })(); //上面至关于 function iife(){ console.log("hello"); } iife();
注意:为了规范,IIFE的函数名虽无心义,但最好加上html
IIFE实现单例模式
var sun=(function(){ console.log("sun create..."); //在声明还未调用时就被直接执行 var name="sun"; var size=1599; function say(){ console.log(name+" "+size); } return{ //返回可供调用的方法或参数 say:say, name:name //返回的name只是一个形参 } })(); sun.say();
IIFE的做用:隔离做用域,防止污染全局命名空间java
闭包
计数器例子
非闭包实现
var count=0; function add(){ count++; console.log(count); } add(); add(); //输出2
上面的计数器缺点是count是全局的,不具备安全性,易被误操做。用闭包就能够解决这个问题安全
闭包实现
function counter(){ var count=0; //函数内部定义,不影响全局 function add(){ count++; console.log(count); } return{ add:add }; } var counter1=new counter(); counter1.add(); counter1.add(); //输出2
IIFE闭包实现
(function counter(){ var count=0; function add(){ count++; console.log(count); } window.counter={ //直接把计时器赋给window做为属性 add:add }; })(); //直接调用,不须要new counter.add(); counter.add(); //输出2
内存泄露解决
当不须要使用闭包时,闭包仍在占用内存,可能会形成 内存泄露闭包
所以,不使用时能够经过:函数
counter=null;
此时counter就被释放了spa