在前端面試中面試官基本都會問到什么是匿名函式、什么是閉包函式,
本文就先來說一下什么是匿名函式,
匿名函式顧名思義就是沒有名字的函式,通常我們所寫的函式都是這樣的:
1 function do(){ 2 // 執行代碼 3 }; 4 5 // 呼叫 6 do();
這種寫法是定義了一個名為do的函式,并通過函式名稱進行呼叫,
那如果沒有名字是什么樣子的啊?
1 function () { 2 // 執行代碼 3 };
這種寫法在編譯的時候會報錯:
Uncaught SyntaxError: Unexpected token (
這是為什么呢?原來時因為瀏覽器在進行語法分析的時候發現這個函式根本沒法執行,
那要為什么還要匿名函式呢?在編程語言中如果又個編碼方式那這種編碼方式肯定是能正常運行的,那該如何讓匿名函式跑起來呢?再看下面的例子:
var do = function () { // 執行代碼 } do();
這種函式大家肯定都知道,其實這種寫法就是將匿名函式復制為變數do,再通過變數名執行函式,
(function(){ // 執行代碼
console.log("列印成功"); })();
上面代碼是什么意思呢?
可以先把上面的代碼分幾個部分:
第一部分是括號里面的匿名函式,第二部分是加上括號的匿名函式,第三部分帶上最后面執行用的括號,
匿名函式在括號內部可以看成是將匿名函式當成是一個變數,再通過括號進行執行,
(function () { // 執行代碼 })(); // 相當于 var do = function() { // 執行代碼 }; do();
其實向上面這種匿名函式的寫法在很多地方都有用到,這種又叫自執行函式,像JQuery 等一些工具包都會用這種寫法,自執行函式有哪些優點呢?
1 // 定義一個全域變數a 2 var a = 1; 3 4 (function() { 5 // 在自執行函式中也創建一個變數a 6 var a = 2; 7 console.log(a); // 2 8 })(); 9 10 console.log(a); // 1
可以看到在自執行函式中列印出來的是2,而在自執行函式中列印出來的是1;
這是為什么?
因為在程式中有個名稱叫做作用域,全域環境的作用域叫做全域作用域,函式中的作用域叫做函式作用域,而作用域是分層的,內部作用域中可以訪問外部作用域中的變數,而外部作用域中卻不可以訪問內部作用域中的變數,
在內部作用域中訪問變數會先在自己所在作用域中查找,如果找不到再在上一層作用域中進行查找,再找不到還會再往上查找,一直到找到全域作用域,這種一層一層的關系像鏈條一樣所以被叫做作用域鏈,
再看上面代碼:在自執行函式中console.log 函式訪問了a變數,首先在自己所在的作用域中查找,找到了a變數,故輸出了a的值2;全域環境中的console.log 函式也訪問了a變數,由于外部作用域不能訪問內部作用域,所以全域環境中訪問的a變數只能在全域函環境中進行查找,所以輸出了a的值1;
總結:自執行函式的優點是為了保證自執行函式中的變數不會受到其他環境的污染,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/147699.html
標籤:JavaScript
