闭包
一句话概括 :函数的作用域取决于声明时,而不取决于调用时!!!
函数的作用取决于声明时,而非调用时,
函数内部声明变量的时候,一定要用 var
命令.如果不用的话,就是声明了一个全局变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| function t1() { var age = 20;
function t2() { console.log(age) }
return t2; }
var tmp = t1();
var age = 99; tmp();
|
函数的作用取决于声明时,而非调用时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| function closure() { var sister = '大桃花'; var me = function () { console.log(sister); }; return me; }
function place() { var sister = '大福晋'; var girl = closure(); girl(); }
place();
|
闭包计数器01
闭包计数器02 — 闭包维护一个别人污染不到的变量,做计数器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| function counter() { var cnt = 0;
var cnter = function () { return ++cnt; }; return cnter; }
var inc = counter(); console.log(inc()); console.log(inc()); console.log(inc());
var cnt = (function () { var cnt = 0; return function () { return ++cnt; } })();
console.log(cnt()); console.log(cnt()); console.log(cnt());
|
闭包计数器03 —在工作中,一般如何避免全局污染或冲突
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
$ = {}; $.cnt = (function () { var cnt = 0; return function () { return ++cnt; } })(); console.log($.cnt()); console.log($.cnt()); console.log($.cnt());
|
闭包计数器04 – 把自己的变量,函数,都放在一个对象里
1 2 3 4 5 6 7 8 9 10 11 12
|
var Y18 = {}; Y18.cnt = (function () { var cnt = 0 return function () { return ++cnt; } })(); console.log(Y18.cnt()); console.log(Y18.cnt()); console.log(Y18.cnt());
|
demo 练习
要求:点击 li ,分别弹出 0,1,2,3
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <ul> <li>男</li> <li>女</li> <li>老</li> <li>少</li> </ul> <script type="text/javascript"> for (var i = 0, lis = document.getElementsByTagName('li'), len = lis.length; i < len; i++) { lis[i].onclick = (function () { var p=i; return function () { return alert(p); } })(); } </script>
|
demo 2
1 2 3 4 5 6 7 8 9 10 11 12 13
| function t1() { let age = 20;
function t2() { console.log(age); }
return t2; }
let fn = t1(); let age = 100; fn();
|
demo 3
1 2 3 4 5 6 7 8 9 10 11 12 13
| function t1(fn) { let a = 20; fn(); }
let a = 100; function t2() { console.log(a); }
t1(t2);
|
demo4
实现每隔一秒答打印0,1,2,3,4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| for (var i = 0; i < 5; i++) { (function (i) { setTimeout(function () { console.log(i); }, i * 1000); })(i); }
for (let i = 0; i < 5; i++) { setTimeout(function () { console.log(i); }, i * 1000); }
|