“约见”面试官系列之常见面试题第二十二篇之函数闭包(建议收藏)
目錄
?
1、概念
2、特點(diǎn)
3、閉包的創(chuàng)建:---
---------------------------------------------我是容易看懂的分界線-----------------------------------------------
4、閉包的應(yīng)用場(chǎng)景
結(jié)論:閉包找到的是同一地址中父級(jí)函數(shù)中對(duì)應(yīng)變量最終的值
1、概念
閉包函數(shù):聲明在一個(gè)函數(shù)中的函數(shù),叫做閉包函數(shù)。
閉包:內(nèi)部函數(shù)總是可以訪問(wèn)其所在的外部函數(shù)中聲明的參數(shù)和變量,即使在其外部函數(shù)被返回(壽命終結(jié))了之后。
2、特點(diǎn)
? 讓外部訪問(wèn)函數(shù)內(nèi)部變量成為可能;
? 局部變量會(huì)常駐在內(nèi)存中;
? 可以避免使用全局變量,防止全局變量污染;
? 會(huì)造成內(nèi)存泄漏(有一塊內(nèi)存空間被長(zhǎng)期占用,而不被釋放)
3、閉包的創(chuàng)建:---
閉包就是可以創(chuàng)建一個(gè)獨(dú)立的環(huán)境,每個(gè)閉包里面的環(huán)境都是獨(dú)立的,互不干擾。閉包會(huì)發(fā)生內(nèi)存泄漏,每次外部函數(shù)執(zhí)行的時(shí) 候,外部函數(shù)的引用地址不同,都會(huì)重新創(chuàng)建一個(gè)新的地址。但凡是當(dāng)前活動(dòng)對(duì)象中有被內(nèi)部子集引用的數(shù)據(jù),那么這個(gè)時(shí)候,這個(gè)數(shù)據(jù)不刪除,保留一根指針給內(nèi)部活動(dòng)對(duì)象。
閉包內(nèi)存泄漏為: key = value,key 被刪除了 value 常駐內(nèi)存中; 局部變量閉包升級(jí)版(中間引用的變量) => 自由變量;
?
上面的都是什么鬼,是人話么,能看懂早就看懂了,生氣······
不過(guò),答應(yīng)我,看完例子再回看上面的概念,會(huì)理解的更!透!徹!
---------------------------------------------我是容易看懂的分界線-----------------------------------------------
4、閉包的應(yīng)用場(chǎng)景
結(jié)論:閉包找到的是同一地址中父級(jí)函數(shù)中對(duì)應(yīng)變量最終的值
最終秘訣就這一句話,每個(gè)例子請(qǐng)自行帶入這個(gè)結(jié)論!!!!!!!!!!!!!
/* 例子1 */
? function funA(){var a = 10; // funA的活動(dòng)對(duì)象之中;return function(){ //匿名函數(shù)的活動(dòng)對(duì)象;alert(a);}}var b = funA();b(); //10/* 例子2 */
function outerFn(){var i = 0;function innerFn(){i++;console.log(i);}return innerFn;}var inner = outerFn(); //每次外部函數(shù)執(zhí)行的時(shí)候,都會(huì)開辟一塊內(nèi)存空間,外部函數(shù)的地址不同,都會(huì)重新創(chuàng)建一個(gè)新的地址inner();inner();inner();var inner2 = outerFn();inner2();inner2();inner2(); //1 2 3 1 2 3/* 例子3 */
var i = 0;function outerFn(){function innnerFn(){i++;console.log(i);}return innnerFn;}var inner1 = outerFn();var inner2 = outerFn();inner1();inner2();inner1();inner2(); //1 2 3 4/* 例子4 */
function fn(){var a = 3;return function(){return ++a;}}alert(fn()()); //4alert(fn()()); //4/* 例子5 */
function outerFn(){var i = 0;function innnerFn(){i++;console.log(i);}return innnerFn;}var inner1 = outerFn();var inner2 = outerFn();inner1();inner2();inner1();inner2(); //1 1 2 2/* 例子6 */
(function() {var m = 0;function getM() { return m; }function seta(val) { m = val; }window.g = getM;window.f = seta;})();f(100);console.info(g()); //100 閉包找到的是同一地址中父級(jí)函數(shù)中對(duì)應(yīng)變量最終的值/* 例子7 */
function a() {var i = 0;function b() { alert(++i); }return b;}var c = a();c(); //1c(); //2/* 例子8 */
function f() {var count = 0;return function() {count++;console.info(count);}}var t1 = f();t1(); //1t1(); //2t1(); //3/* 例子9 */
var add = function(x) {var sum = 1;var tmp = function(x) {sum = sum + x;return tmp;}tmp.toString = function() {return sum;}return tmp;}alert(add(1)(2)(3)); //6/* 例子10 */
var lis = document.getElementsByTagName("li");for(var i=0;i<lis.length;i++){(function(i){lis[i].onclick = function(){console.log(i);};})(i); //事件處理函數(shù)中閉包的寫法}/* 例子11 */
function m1(){var x = 1;return function(){console.log(++x);}}m1()(); //2m1()(); //2m1()(); //2var m2 = m1();m2(); //2m2(); //3m2(); //4/* 例子12 */
var fn=(function(){var i=10;function fn(){console.log(++i);}return fn;})()fn(); //11fn(); //12/* 例子13 */function love1(){var num = 223;var me1 = function() {console.log(num);}num++;return me1;}var loveme1 = love1();loveme1(); //輸出224/* 例子14 */
function fun(n,o) {console.log(o);return {fun:function(m) {return fun(m,n);}};}var a = fun(0); //undefineda.fun(1); //0a.fun(2); //0a.fun(3); //0var b = fun(0).fun(1).fun(2).fun(3); //undefined 0 1 2var c = fun(0).fun(1);c.fun(2);c.fun(3); //undefined 0 1 1/* 例子15 */
function fn(){var arr = [];for(var i = 0;i < 5;i ++){arr[i] = function(){return i;}}return arr;}var list = fn();for(var i = 0,len = list.length;i < len ; i ++){console.log(list[i]());} //5 5 5 5 5/* 例子16 */
function fn(){var arr = [];for(var i = 0;i < 5;i ++){arr[i] = (function(i){return function (){return i;};})(i);}return arr;}var list = fn();for(var i = 0,len = list.length;i < len ; i ++){console.log(list[i]());} //0 1 2 3 4本面試題為前端常考面試題,后續(xù)有機(jī)會(huì)繼續(xù)完善。我是歌謠,一個(gè)沉迷于故事的講述者。
歡迎一起私信交流。
“睡服“面試官系列之各系列目錄匯總(建議學(xué)習(xí)收藏)?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的“约见”面试官系列之常见面试题第二十二篇之函数闭包(建议收藏)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机三级数据库要安装什么软件,计算机三
- 下一篇: Backtrack 4 – Bootab