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();

参考资料