My Octopress Blog

A blogging framework for hackers.

วากันเรื่อง Scope ใน Javascript ตอนที่ 1

Blog ตอนนี้แบ่งเป็น 2 Part คือ Javascript และ ภาษา C

ตอนแรกกะเขียนตอนเดียวจบแต่มันยาวแหละหนักเลยขอเรียกตอนนี้่ว่าตอนที่ 1 แล้วกัน

เริ่มเลยแล้วกันเนอะ….

Part: ภาษา javascript

##Scopeใน javascript

var scope = "global"
function f() {
  alert(scope);
  var scope  = "local";
  alert(scope);
}

จาก code มี alert สองครั้ง ลองเดาหน่อยไม๊ว่า output จะได้อะไรบ้าง?

กดดูคำตอบ

บางคนอาจจะสงสัยว่าเอ๊ะ ยังไงกันนะ

มันควรจะได้ global แล้ว ค่อย local สิ แต่ทำไมมันดันได้ undefine และ local ล่ะ?

ลองดู code javascript ล่าง ซึ่งมันสมมูลกับ code ตัวอย่างข้างบนครับ

function f() {
  var scope;
  alert(scope);
  scope = "local";
  alert(scope);
}

ทำไม ทำไม ทำไม????

ในภาษา javascript ถ้ามีการประกาศตัวแปรไว้ในฟังก์ชั่นไม่ว่าจะประกาศตรงไหนของฟังก์ชั่นแล้วเผอิญใช้ชื่อซ้ำกับตัวแปรที่มีซ้ำกับ scope ที่อยู่นอกกว่า scope นอกจะโดนซ่อนทันที เพราะ javascript จะหาก่อนว่ามีตัวแปรในสโคปนั้นไม๊ แล้วค่อยเอาค่าออกมาใช้ดัง flowchart ข้างล่าง

Scope Chaind and variable resolution

จบส่วนของ javascript ครับ ใครเคยเขียนภาษาตระกูล C มาคงงงเล็กน้อยว่า อ้าว… ไหงงั้นล่ะ? ถ้าสนใจลองอ่านต่อใน Part ภาษา C ได้ครับ

Part: ภาษา C ที่ต่างกันในเรื่องของ Scope

##Scope ในภาษา C

c code: /* Block 1 */ int c = 3; { int c = 4; } printf (“c :1 = %d \n”, c);

  /* Block 2 */
  {
    printf ("inner c :1.5  = %d \n", c);
    c = 8;
    int c = 5;
  }
  printf ("c :2 = %d \n", c);

compile & run $ gcc scope.c ; ./a.out

/* output */
c :1 = 3
inner c :1.5  = 3
c :2 = 8

ใครเคยเขียนภาษา C ก็น่าจะตอบได้อย่างมั่นใจเลยว่า c :1 => 3 ที่ไม่เป็น 4 ก็เพราะการกำหนด int c = 4; เป็นการสร้างตัวแปรใหม่ ดังนั้นตัวแปร c ที่เกิดขึ้นมาใหม่นั้นจึงมีชีวิตอยู่แค่ใน block { } จบ block 1 ตัวแปร c (ที่เกิดขึ้นใน block 1) ก็ตายไป

ส่วน inner c :1.5 ได้ 3 ก็เพราะว่า ใช้้ค่า c จาก scope main ไปก่อน เพราะว่ายังไม่มีการสร้างตัวแปรใหม่

ส่วน c :2 = 8 เป็นเพราะ c ถูก set ตอน scope ยังเป็นของ main อยู่ (ยังไม่เกิดตัวแปรใหม่ใน block) ส่วน int c = 5; ก็ตายไปหลังจบ Block 2 c :2 จึงได้ค่า 8 มา

จบแล้วครับ เหนื่อยเลยทีเดียว

โชคดีครับ