iT邦幫忙

2022 iThome 鐵人賽

DAY 27
0
自我挑戰組

I don't know JS yet系列 第 27

[ Day 27 ] I don't know JS yet - Hoisting

  • 分享至 

  • xImage
  •  

今天的學習是 Scope & Closure CH.5 以及 Scope & Closure apA.md 的內容。

Why hoisting ?

  1. Executable code first, function declarations last
  2. Semantic placement of variable declarations

在 JS 裡,有兩個東西會在 compiling 時被 hoist

  1. function declaration
  2. variable declaration (only var)

範例一:function declaration hoisting

greeting(); // Hello World!

function greeting() {
    console.log('Hello World!');
};

在 compiling 時期,engine 遇到 function declaration 會將其「提升」至 scope 的最上方。

範例二:variable hoisting

greeting = "Hello!";
console.log(greeting); // Hello!

var greeting = "Hi!";

在 compiling 到第四行時,engine 會將變數 greeting 提升到 scope 的最上方,並給予 undefined 作為初始值。因此「感覺上」像這樣:

var greeting;
greeting = "Hello!";

console.log(greeting);

範例三: function expression hoisting

greeting(); // TypeError

var greeting = function() {
    console.log("Hello World!");
};

我們最開頭提到,function declaration 和 var 變數會被提升。
TypeError 代表 operation 不能正常執行,通常和 value 的 type 不正確有關,詳細看 mdn

var greeting 雖然被提升至 scope 最上方,但是初始值是 undefined,而 function(){...} 需等到 runtime 才會被 assign 給 greeting。因此第一行的 greeting value 是 undefined,而不是一個 function。


上一篇
[ Day 26 ] I don't know JS yet - 關於具名與匿名函式
下一篇
[ Day 28 ] I don't know JS yet - Variable Re-declaration? ( part1 )
系列文
I don't know JS yet30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言