javaScript面試題整理 --- 什麼是閉包,什麼是立即執行函式,它的作用是什麼?簡單說一下閉包的使用場景
什麼是閉包,簡單說一下閉包的使用場景
要理解閉包,首先必須理解Javascript特殊的變數作用域
變數的作用域無非就是兩種:全域性變數和區域性變數。
Javascript語言的特殊之處:
1、函式內部可以直接讀取全域性變數。
2、在函式外部自然無法讀取函式內的區域性變數。
3、函式內部宣告變數的時候,一定要使用var命令。如果不用的話,你實際上宣告瞭一個全域性變數!
出於種種原因,我們有時候需要得到函式內的區域性變數。但是,前面已經說過了,正常情況下,這是辦不到的,只有通過變通方法才能實現。
那就是在函式的內部,再定義一個函式。
function f1(){
var n=999;
function f2(){
alert(n); // 999
}
}
在上面的程式碼中,函式f2就被包括在函式f1內部,這時f1內部的所有區域性變數,對f2都是可見的。但是反過來就不行,f2內部的區域性變數,對f1就是不可見的。這就是Javascript語言特有的"鏈式作用域"結構(chain scope),子物件會一級一級地向上尋找所有父物件的變數。所以,父物件的所有變數,對子物件都是可見的,反之則不成立。
既然f2可以讀取f1中的區域性變數,那麼只要把f2作為返回值,我們不就可以在f1外部讀取它的內部變數了嗎
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
上一節程式碼中的f2函式,就是閉包。
由於在Javascript語言中,只有函式內部的子函式才能讀取區域性變數,因此可以把閉包簡單理解成"定義在一個函式內部的函式"。
所以,在本質上,閉包就是將函式內部和函式外部連線起來的一座橋樑。
閉包的使用場景:
1.setTimeout
原生的setTimeout傳遞的第一個函式不能帶引數,通過閉包可以實現傳參效果。
2、回撥
定義行為,然後把它關聯到某個使用者事件上(點選或者按鍵)。程式碼通常會作為一個回撥(事件觸發時呼叫的函式)繫結到事件。
3、函式防抖
在事件被觸發n秒後再執行回撥,如果在這n秒內又被觸發,則重新計時。實現的關鍵就在於setTimeOut
這個函式,由於還需要一個變數來儲存計時,考慮維護全域性純淨,可以藉助閉包來實現。
4.封裝私有變數
什麼是立即執行函式?
宣告一個函式,並馬上呼叫這個匿名函式就叫做立即執行函式;也可以說立即執行函式是一種語法,讓你的函式在定義以後立即執行;
(function(){
//code
}())
(function (){
//code
})()
它的作用是什麼
- 不必為函式命名,避免了汙染全域性變數
- 立即執行函式內部形成了一個單獨的作用域,可以封裝一些外部無法讀取的私有變數
- 封裝變數
立即執行函式會形成一個單獨的作用域,我們可以封裝一些臨時變數或者區域性變數,避免汙染全域性變數
相關文章
- 征服 JavaScript 面試:什麼是閉包JavaScript面試
- 什麼是閉包?有哪些使用場景?優缺點是什麼?
- javascript中閉包是什麼JavaScript
- Python中什麼是閉包?閉包的好處是什麼?Python
- 閉包函式到底是什麼?有什麼用?函式
- [JS]什麼是閉包?JS
- 什麼是閉包陷阱?
- JS 中的閉包是什麼?JS
- 面試官問我:什麼是JavaScript閉包,我該如何回答面試JavaScript
- 什麼是過時閉包及如何解決過時閉包的坑
- 立即執行函式(IIFE)&&閉包函式
- web裡什麼是Math函式,作用是什麼Web函式
- 一個故事教你看懂什麼是數字證書,它的原理是什麼?它的作用是什麼?
- 征服 JavaScript 面試:什麼是純函式?JavaScript面試函式
- 面試官:Kafka是什麼,它有什麼特性與使用場景?面試Kafka
- 面試官:ElasticSearch是什麼,它有什麼特性與使用場景?面試Elasticsearch
- 面試官:RocketMQ是什麼,它有什麼特性與使用場景?面試MQ
- 面試官:Zookeeper是什麼,它有什麼特性與使用場景?面試
- HDFS 01 - HDFS是什麼?它的適用場景有哪些?它的架構是什麼?架構
- 什麼是IIFE(立即呼叫函式表示式)?函式
- 什麼是JavaScript閉包終極全解之一——基礎概念JavaScript
- javascript純函式是什麼JavaScript函式
- [譯]掌握 JavaScript 面試:什麼是純函式?JavaScript面試函式
- 征服 JavaScript 面試:什麼是函式組合JavaScript面試函式
- 為什麼js會有閉包JS
- 什麼是MongoDB,它的優勢和不足以及適用場景是什麼?MongoDB
- 交換機是什麼,它的工作原理是什麼
- javascript函式節流是什麼JavaScript函式
- 什麼是去中心化錢包?去中心化錢包是什麼意思?中心化
- 面試官: 說說看, 什麼是 Hook (鉤子) 執行緒以及應用場景?面試Hook執行緒
- SID是什麼?用於什麼場景
- 什麼是CDN?CDN的原理和作用是什麼?
- 什麼是@Component,@Component的作用是什麼
- 什麼是資料標註,它的用途是什麼?
- javascript函子是什麼JavaScript
- Javascript之旅——第十站:為什麼都說閉包難理解呢?JavaScript
- 什麼是海外伺服器?它的優點是什麼?伺服器
- 為什麼redis是單執行緒的以及為什麼這麼快?Redis執行緒