本篇文章將為各位介紹JavaScript中什麼是匿名函數,希望看完本篇文章各位能對JavaScript中匿名函數的概念、使用有一定的認識。
JavaScript中什麼是匿名函數?
在前端面試中面試官基本上都會問到什麼是匿名函數、什麼是閉包函數。
本文就先來說一下什麼是匿名函數。
匿名函數顧名思義就是沒有名字的函數,通常我們所寫的函數都是這樣的:
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;
這是為什麼?
因為程式中有個名稱叫做作用域,全域環境的作用域叫做全域作用域,函數中的作用域叫做函數作用域,而作用域是分層的,內部作用域中可以存取外部作用域中的變量,而外部作用域中卻不可以存取內部作用域中的變數。
在內部作用域中存取變數會先在自己所在作用域中查找,如果找不到再在上一層作用域中進行查找,再找不到還會再往上查找,一直到找到全域作用域。這種一層一層的關係像鏈條一樣所以被叫做作用域鏈。
再看上面程式碼:在自執行函數中console.log 函數存取了a變量,首先在自己所在的作用域中查找,找到了a變量,故輸出了a的值2;全域環境中的console.log 函數也存取了a變量,由於外部作用域無法存取內部作用域,所以全域環境中存取的a變數只能在全域函環境中進行查找,所以輸出了a的值1;
總結:自執行函數的優點是為了確保自執行函數中的變數不會受到其他環境的污染。
本文來自 js教學 欄目,歡迎學習!
以上是JavaScript中什麼是匿名函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!