要知道打印什麼需要具備2個知識點
一、函數聲明和函數表達式的區別
二、匿名函數與具名函數的區別
首先來說說第一點:
要區分函數聲明和函數表達式,只需要知道function是不是聲明中的第一個詞,如果是,那就是函數聲明,否則就是函數表達式;
函數聲明和函數表達式之間最重要的區別是他們的名稱標識符將會綁定在何處;
舉個例子
函數聲明:
function foo(){},foo 被綁定在所在作用域中,可以直接通過foo() 來調用它;
函數表達式:
(function foo(){})
foo被綁定在函數表達式自身的函數中,外部作用域無法訪問foo;
第二個知識點匿名函數與具名函數的區別
函數表達式可以是匿名,寫成這樣(function(){})是合法的;函數聲明則不可以省略函數名;
具名函數有幾個好處:
a、在棧追蹤中可以顯示出有意義的函數名,調試方便;
b、可以在函數內引用自身
c、代碼更具有可讀性、可理解性;
具備以上兩個知識點,就可以很好的分析會打印出什麼了
var b = 10;
(function b() {
// 會在這作用域內聲明常量b,引用函數自身
b = 20;
console.log(b);
})();
在立即執行函數表達式自調用後,會在自己的函數執行上下文中收集到一個和函數同名的b常量(表達式函數的標識符不可修改),常量的值爲引用函數體自身;
接下來b = 20 是指向function b,由於自身特性不能改變b的引用,所以無效;
最後輸出b函數;