什麼是匿名函式、什麼是閉包函式?
在前端面試中面試官基本都會問到什麼是匿名函式、什麼是閉包函式。
本文就先來說一下什麼是匿名函式。
匿名函式顧名思義就是沒有名字的函式,通常我們所寫的函式都是這樣的:
function do(){
// 執行程式碼
};
// 呼叫
do();
這種寫法是定義了一個名為do的函式,並通過函式名稱進行呼叫。
那如果沒有名字是什麼樣子的啊?
function () {
// 執行程式碼
};
這種寫法在編譯的時候會報錯:
Uncaught SyntaxError: Unexpected token (
這是為什麼呢?原來時因為瀏覽器在進行語法分析的時候發現這個函式根本沒法執行。
那要為什麼還要匿名函式呢?在程式語言中如果又個編碼方式那這種編碼方式肯定是能正常執行的,那該如何讓匿名函式跑起來呢?再看下面的例子:
var do = function () {
// 執行程式碼
}
do();
這種函式大家肯定都知道,其實這種寫法就是將匿名函式複製為變數do,再通過變數名執行函式。
(function(){
// 執行程式碼
console.log("列印成功");
})();
上面程式碼是什麼意思呢?
可以先把上面的程式碼分幾個部分:
第一部分是括號裡面的匿名函式,第二部分是加上括號的匿名函式,第三部分帶上最後面執行用的括號。
匿名函式在括號內部可以看成是將匿名函式當成是一個變數,再通過括號進行執行。
(function () {
// 執行程式碼
})();
// 相當於
var do = function() {
// 執行程式碼
};
do();
其實向上面這種匿名函式的寫法在很多地方都有用到,這種又叫自執行函式,像JQuery 等一些工具包都會用這種寫法,自執行函式有哪些優點呢?
// 定義一個全域性變數a
var a = 1;
(function() {
// 在自執行函式中也建立一個變數a
var a = 2;
console.log(a); // 2
})();
console.log(a); // 1
可以看到在自執行函式中打印出來的是2,而在自執行函式中打印出來的是1;
廣州品牌設計公司https://www.houdianzi.com PPT模板下載大全
這是為什麼?
因為在程式中有個名稱叫做作用域,全域性環境的作用域叫做全域性作用域,函式中的作用域叫做函式作用域,而作用域是分層的,內部作用域中可以訪問外部作用域中的變數,而外部作用域中卻不可以訪問內部作用域中的變數。
在內部作用域中訪問變數會先在自己所在作用域中查詢,如果找不到再在上一層作用域中進行查詢,再找不到還會再往上查詢,一直到找到全域性作用域。這種一層一層的關係像鏈條一樣所以被叫做作用域鏈。
再看上面程式碼:在自執行函式中console.log 函式訪問了a變數,首先在自己所在的作用域中查詢,找到了a變數,故輸出了a的值2;全域性環境中的console.log 函式也訪問了a變數,由於外部作用域不能訪問內部作用域,所以全域性環境中訪問的a變數只能在全域性函環境中進行查詢,所以輸出了a的值1;
總結:自執行函式的優點是為了保證自執行函式中的變數不會受到其他環境的汙染。