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 ข้างล่าง
จบส่วนของ 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
มา
จบแล้วครับ เหนื่อยเลยทีเดียว
โชคดีครับ