functionfn(){ var num = Math.random(); return num; } var a = fn(); console.log(a); // => 0.23493962781503797
那么如果在函数外部需要获取两次或多次num的值呢???
1 2 3 4 5 6 7 8
functionfn(){ var num = Math.random(); return num; } var a = fn(); var b = fn(); console.log(a); // => 0.059904436115175486 console.log(b); // => 0.8948184980545193
很明显调用了两次fn获取了两个不一样的值
如果需要获取多次num的值并且需要值一样又该怎么做呢???
1 2 3 4 5 6 7 8 9 10 11
functionfn(){ var num = Math.random(); returnfunction(){ return num; }; } var f = fn(); var a = f(); var b = f(); console.log(a); // => 0.36699223099276423 console.log(b); // => 0.36699223099276423
functionfn(){ var num1 = Math.random(); var num2 = Math.random(); return { num1: function(){ return num1; }, num2: function(){ return num2; } }; } var f = fn(); var a1 = f.num1(); var a2 = f.num2(); var b1 = f.num1(); var b2 = f.num2(); console.log(a1); // => 0.859178748447448 console.log(b1); // => 0.859178748447448 console.log(a2); // => 0.18789607286453247 console.log(b2); // => 0.18789607286453247
那么如果既要可以获取又要可以修改fn中的值该怎么做呢???
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
functionfn(){ var num; return { getNum: function(){ return num; }, setNum: function(n){ num = n; } }; } var f = fn(); var get1 = f.getNum(); console.log(get1); // => undefined f.setNum(123); var get2 = f.getNum(); console.log(get2); // => 123
通过返回一个对象,该对象包含不同的操作函数,来实现复杂的闭包
也可以直接返回匿名函数,通过匿名函数再返回一个对象,来实现闭包
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
functionfn(){ var num; var o = { oNum: num }; num = o.oNum; returnfunction(){ return o; }; } var f = fn(); var get1 = f().oNum; console.log(get1); // => undefined f().oNum = 123; var get2 = f().oNum; console.log(get2); // => 123