> 咕笛老師:閉包是必會的一個知識點,雖然在實際開發中不一定能用的上,但是這種思想一定要清楚的。很多插件和組件都是基于閉包開發的。
>
**閉包函數:**
聲明在一個函數中的函數,叫做閉包函數。
**閉包:**
內部函數總是可以訪問其所在的外部函數中聲明的參數和變量,即使在其外部函數被返回(壽命終結)了之后。
函數`A`內部有一個函數`B`,函數`B`可以訪問到函數`A`中的變量,那么函數`B`就是閉包
**閉包的實質:**
是因為函數嵌套而形成的作用域鏈
**閉包的作用:**
匿名自執行函數、緩存、實現封裝(主要作用)、實現面向對象中的對象
**/\* 例子 0\*/**
~~~
var person = function(){
//變量作用域為函數內部,外部無法訪問
var name = "default";
return {
getName : function(){
return name;
},
setName : function(newName){
name = newName;
}
}
}();
print(person.name);//直接訪問,結果為undefined
print(person.getName());
person.setName("a");
print(person.getName());
//得到結果如下:
undefined
default
a
~~~
**/\* 例子1 \*/**
~~~javascript
function funA(){
var a = 10;
// funA的活動對象之中;
return function(){
//匿名函數的活動對象;
alert(a);
}}
var b = funA();
b();
//10
~~~
**/\* 例子2 \*/**
~~~javascript
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 \*/**
~~~javascript
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
~~~
- js面試題
- 說一下自己常用的es6的功能?
- 頁面渲染html的過程?
- 說一下事件代理?
- 說一下繼承的幾種方式及優缺點?
- 說一下閉包?
- 對JSONP的理解*
- 基本的數據類型有哪些?
- js程序題
- JS找字符串中出現最多的字符
- 數組去重怎么作?
- 變量提升的這道題你會嗎
- 用一段代碼思考this的指向問題
- 這些類型的typeof返回什么值?
- 怎樣添加、移除、移動、復制、創建和查找節點?
- css面試題
- css水平、垂直居中的寫法,請至少寫出4種
- 1rem、1em、1vh、1px各自代表的含義?
- 說一下盒模型?
- 清除浮動的幾種方式,及原理?
- b與strong的區別?
- img中的alt與title屬性?
- 瀏覽器兼容性
- IE6的BUG你都遇過哪些?怎么解決的?
- html面試題
- 對HTML結構語義化的理解?
- 前端工程化面試題
- webpack
- export和export default的區別?
- VueJs面試題
- 基礎
- 生命周期
- vue路由(vue-router)
- 狀態管理(vuex)
- axios
- vue-cli框架
- 前端架構面試題
- HTTP
- get、post的區別
- 你所知道的http的響應碼及含義?