JavaScript-函數陳述式與函數表示式

陳述式vs.表示式

  • 陳述式(Statement)只是去做某件事。
  • 表示式(Expression)是程式碼的單位,位,會形成一個值,但不一定要存於一個變數中。

    陳述式

    if本身只是一個陳述句,它會去做其他事,但是不會回傳任何值。而在if的()中的條件是表示式,因為他會回傳一個值,true或false。
    1
    2
    3
    4
    var a;
    if (a === 3) {

    }

表示式

以下三行分別的程式碼,都是一個表示式,因為他們執行完之後,都會回傳一個值。

1
a = 3;

1
1 + 2;//3
1
a = {language:'english'}

以下執行結果可證,程式碼會回傳一個值,這個值可以是數值、字串或物件,無論是什麼型態都可以。

函數陳述式

當它被呼叫執行,它不會回傳值

1
2
3
4
function greet(){
console.log('hi');
}
greet();

函數表示式

先宣告一個變數,並將一個函式assigm給該變數。因為函式在JavaScript中是一個物件,所以當該函式被指派給anonymousGreet變數時,在記憶體中的,anonymousGreet變數就會指向函式物件

1
2
3
4
var anonymousGreet = function(){
console.log('hi');
}
anonymousGreet();

在這個例子中,該函式中並沒有name,是一個匿名函式,不過因為被assign給變數,所以可以透過該變數名去參照它。

所以在下圖中特別被標記出的這段程式碼為函數表示式,當整段程式碼執行時,會叫出函式物件並作回傳。

函數表示式並不會被hositing

1
2
3
4
5
6
7
anonymousGreet();//Uncaught TypeError: undefined is not a function.

var anonymousGreet = function(){
console.log();
}

anonymousGreet();//hi

在程式碼的創建階段,會在記憶體中創建變數anonymousGreet,預設值為undefined。
開始執行,第1行呼叫函式,卻發現anonymousGreet為undefined值,而非一個函式,因此就會被出錯。
因此正確寫法,應該是要在執行完第3行,assign一個函式給變數之後,才能如第7行呼叫。

將函數表示式作為傳入參數

在JavaScript中,函式為一級函式,也就是函式可以視為物件,因此也可以作為將函式表示式作為另外一個函式的傳入參數。

1
2
3
4
5
6
function log(a){
a();
}
log(function(){
console.log('hi');
})

© 2020 Leah's Blog All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero