我們的JavaScript分爲三部分:
EcmaScript(JS核心),DOM,BOM。、
面試中經常會有面試官問我們什麼是閉包?你理解的閉包是什麼?優缺點?使用場景?
一:閉包的概念:
閉包就是一個的函數的返回值是另外一個函數,返回的這個函數調用了其父函數的內部變量且在外部被執行,就產生了閉包。
特點:函數嵌套函數,內部的函數可以訪問外部函數的變量。
閉包=函數+自由變量。
-
優點: 1. 長期駐紮在內存中
2. 私有成員的存在
3. 可以隔離作用域,不造成全局污染 -
缺點:
由於常駐內存,使用不當可能會造成泄漏 -
如何解決內存泄漏:講暴露在外面的變量都置爲null。
使用場景:封裝組件 for循環和定時器結合使用 for循環和dom事件結合 ,節流防抖函數的使用 導航欄獲取下標
二:閉包實現一個計數器:
//功能:遞增,遞減,獲取遞增或遞減之後的值
var Counter=function() {
//私有變量
var num=0;
//私有函數
var changeValue=function(n) {
return num+=n;
}
return {
//增
increment:function() {
changeValue(1)
},
//減
decrement:function() {
changeValue(-1)
},
//獲取值
getValue:function() {
return num;
}
}
}
三:定時器的累加:
//要求每隔1秒打印1,2,3,.....10
//setTimeout是異步執行的,異步隊列。
for(var i=1;i<=10;i++) {
(function(j) {
setTimeout(function() {
console.log('i=j的值:',j)
},2000*j)
})(i)
}
console.log('最後打印:',i)
for(let i=1;i<=10;i++) {
setTimeout(function() {
console.log('i的值:',i)
},1000*i)
}
四:改變頁面的字體大小:
<p class="p1">我可真好看</p>
<button class="btn>改變字體</button>
//先聲明一個 設置字體大小的函數
function setSize(size) {
return function() {
p1.style.fontSize=size+'px'
}
}
var size12=setSize(12);
var size40=setSize(40)
var size50=setSize(50);
var p1=document.queryselector('.p1');
var btn=document.getElementByClassName('btn');
btn=size12
btn=size40;
btn=size50;
五:封裝組件:
立即調用函數
(function(win,doc) {
//私有變量
//私有方法
return {
//暴露出去的方法
}
})(window,document)