“约见”面试官系列之常见面试题第二十二篇之函数闭包(建议收藏)
目錄
?
1、概念
2、特點
3、閉包的創建:---
---------------------------------------------我是容易看懂的分界線-----------------------------------------------
4、閉包的應用場景
結論:閉包找到的是同一地址中父級函數中對應變量最終的值
1、概念
閉包函數:聲明在一個函數中的函數,叫做閉包函數。
閉包:內部函數總是可以訪問其所在的外部函數中聲明的參數和變量,即使在其外部函數被返回(壽命終結)了之后。
2、特點
? 讓外部訪問函數內部變量成為可能;
? 局部變量會常駐在內存中;
? 可以避免使用全局變量,防止全局變量污染;
? 會造成內存泄漏(有一塊內存空間被長期占用,而不被釋放)
3、閉包的創建:---
閉包就是可以創建一個獨立的環境,每個閉包里面的環境都是獨立的,互不干擾。閉包會發生內存泄漏,每次外部函數執行的時 候,外部函數的引用地址不同,都會重新創建一個新的地址。但凡是當前活動對象中有被內部子集引用的數據,那么這個時候,這個數據不刪除,保留一根指針給內部活動對象。
閉包內存泄漏為: key = value,key 被刪除了 value 常駐內存中; 局部變量閉包升級版(中間引用的變量) => 自由變量;
?
上面的都是什么鬼,是人話么,能看懂早就看懂了,生氣······
不過,答應我,看完例子再回看上面的概念,會理解的更!透!徹!
---------------------------------------------我是容易看懂的分界線-----------------------------------------------
4、閉包的應用場景
結論:閉包找到的是同一地址中父級函數中對應變量最終的值
最終秘訣就這一句話,每個例子請自行帶入這個結論!!!!!!!!!!!!!
/* 例子1 */
? function funA(){var a = 10; // funA的活動對象之中;return function(){ //匿名函數的活動對象;alert(a);}}var b = funA();b(); //10/* 例子2 */
function outerFn(){var i = 0;function innerFn(){i++;console.log(i);}return innerFn;}var inner = outerFn(); //每次外部函數執行的時候,都會開辟一塊內存空間,外部函數的地址不同,都會重新創建一個新的地址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 閉包找到的是同一地址中父級函數中對應變量最終的值/* 例子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); //事件處理函數中閉包的寫法}/* 例子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本面試題為前端常考面試題,后續有機會繼續完善。我是歌謠,一個沉迷于故事的講述者。
歡迎一起私信交流。
“睡服“面試官系列之各系列目錄匯總(建議學習收藏)?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的“约见”面试官系列之常见面试题第二十二篇之函数闭包(建议收藏)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机三级数据库要安装什么软件,计算机三
- 下一篇: Backtrack 4 – Bootab