function expression(函式陳述式) VS declaration (函式運算式)

Node.js function expression(函式陳述式) VS declaration (函式運算式)

declaration (函式運算式)

function declarationFunction(){
	console.log(123);
}

declarationFunction();

function expression (函式陳述式)

let expressionFunction = function(){
	console.log(123);
}

expressionFunction();

差異

提前使用 function

declaration (函式運算式) 因為 hoisting 提升 的關係,所以可以順利執行

declarationFunction();

function declarationFunction(){
    // 123
    console.log(123);
}

expression (函式陳述式) 則是因為變數尚未未宣告內容,所以無法執行

// ReferenceError: Cannot access 'expressionFunction' before initialization
expressionFunction();

let expressionFunction = function(){
    console.log(123);
}

記憶體回收機制

declaration (函式運算式)

  • 只要被定義過後就無法從記憶體中刪除並回收

expression (函式陳述式)

  • 正常的跟著變數生命週期運作, 所以可能定義完後則直接被回收或是跟著變數的參考被移除時就結束等待 Garbage Collection 回收

正常回收記憶體

declaration (函式運算式) 直接被回收

// declaration (函式運算式)直接被回收
(function(val){
    console.log(val);
})(123);

expression (函式陳述式) 變數設定為 null 被回收

let expressionFunction=function(){
    console.log(123);
}

expressionFunction();
expressionFunction=null;
// expressionFunction is not a function
expressionFunction();

參考資料