2019年4月8日 星期一

關於Function declaration和Function expression的差異

關於Function declaration和Function expression的差異

前言

  最近在youtube看到Top 10 JavaScript Interview Questions ( Part 2 ),才發現原來這有差別,在此做個紀錄。

內容

  Function expression的行為和我認知的行為一致,範例如下
funExpression();//ReferenceError: funExpression is not defined
let funExpression=function(){
  console.log('I am a function expression');
}
funExpression();//I am a function expression

再來看看Function declaration,範例如下
funDeclaration();//I am a function declaration
function funDeclaration(){
  console.log('I am a function declaration');
}
funDeclaration();//I am a function declaration

可以看到第一次喚起"funDeclaration"時遽然可以正常喚起!這表示Javascript其實會先把整段程式碼先解讀過才執行,而不是一行一行執行,如果是一行一行執行,在第一次喚起"funDeclaration"應該要和Function expression一樣認定該變數不存在。

  如果上網查詢Javascript會被歸類在"直譯",查了一下直譯器wiki,裡面解釋直譯為"把高階程式語言一行一行直接轉譯執行",而編譯是"編譯器已一次將所有原程式碼翻譯成另一種語言",而從Function declaration的行為來看,是將片段程式碼解讀後執行,這樣也算是"直譯"!?看來我必須對"直譯"的觀念該更新了。

參考資料

沒有留言:

張貼留言