什么是閉包,閉包的定義是什么
函數(shù)和其本身對周圍狀態(tài)的引用兩者捆綁在一起構(gòu)成閉包。也即是說閉包可以從函數(shù)內(nèi)部訪問外部的作用域,在js中迫靖,每當(dāng)函數(shù)創(chuàng)建時院峡,就會在函數(shù)生成時生成閉包。
閉包是js函數(shù)作用域的副產(chǎn)品系宜,正是由于JS函數(shù)內(nèi)部可以訪問函數(shù)外部變量的設(shè)定符合了閉包的定義照激,所以才會有了閉包。
閉包是什么樣子的
eg.1:
var name = 'zhang san';
function show() {
console.log(show);
}
show() // zhang san
以上例子完全滿足閉包的定義:函數(shù)內(nèi)部可以訪問函數(shù)外部的變量盹牧,這就是一個簡單的閉包俩垃。
eg.2:
function foo(){
var local = 1
function bar(){
local++
return local
}
return bar
}
var func = foo()
func() // 2
上面這個是創(chuàng)建閉包的常見方式,即在一個函數(shù)內(nèi)部創(chuàng)建另一個函數(shù)汰寓;
在這上面函數(shù)bar與變量local組成了一個閉包口柳;
函數(shù)bar,return出來有滑,是為了能夠在函數(shù)foo外能夠訪問函數(shù)bar跃闹;如果不return出來,在函數(shù)foo外就無法使用這個函數(shù)毛好,把return改為window.bar=bar是一樣的望艺;所以return bar只是為了bar能被使用,和閉包無關(guān)肌访。
eg.3:
var foo = {};
// 初始化
(function (object) {
var x = 10;
object.getX = function() {
return x;
};
})(foo);
alert(foo.getX()); // 10
立即執(zhí)行函數(shù)與閉包結(jié)合使用找默,匿名函數(shù)內(nèi)部的變量x函數(shù)外無法訪問,通過函數(shù)getx對外暴露出內(nèi)部變量吼驶,這就形成了閉包惩激;
閉包和立即執(zhí)行和書沒有必然聯(lián)系店煞,只是有時想用到閉包那么可以用(function(){})()來構(gòu)成閉包,而不是(function(){})()是閉包咧欣。
閉包的使用場景
1.利用閉包實(shí)現(xiàn)模塊化
(function () {
var a = 10;
var b = 20;
function add(num1, num2) {
var num1 = !!num1 ? num1 : a;
var num2 = !!num2 ? num2 : b;
return num1 + num2;
}
window.add = add;
})();
add(10, 20);
2.采用函數(shù)引用方式的setTimeOut調(diào)用(原生的setTimeout傳遞的第一個函數(shù)不能帶參數(shù))
function f1(a) {
function f2() {
console.log(a);
}
return f2;
}
var fun = f1(1);
setTimeout(fun,1000);