My Octopress Blog

A blogging framework for hackers.

Something About My Mind

อยู่ๆก็รู้สึกว่า เราเป็นคนที่กลัวอดีตหรือนี่…

ถ้าผมกำลังวิ่งหนีอดีต … แล้วผมจะวิ่งไปหาอะไร ไปเจออะไร?ิิิ

กำลังดู Blueberry pie

2:25 am

วากันเรื่อง 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 มา

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

โชคดีครับ

ท่าพิเศษสำหรับ Operator && และ Operator || ใน Javascript (Short-circuit Evaluation)

ท่าพิเศษสำหรับ operator && และ operator || ใน javascript (Short-circuit evaluation)

ปกติแล้วเรามอง && และ   ว่าเป็นตัวดำเนินการทางด้านตรรกะ (logical operator) เอาไว้ตรวจสอบเงื่อนไขก่อนเข้า if/while ว่าจริง หรือ ไม่จริง operator || และ && เป็น Short-circuit operator ภาษา javascript จะ return LastValue ของการประมวลผลมาให้ด้วย

การ Return ค่าของ operator && และ operator || ใน javascript

* operator && จะ return ตัวหลังถ้าตัวแรกเป็นจริง

เช่น

console.log(true && 'Hello Javascript');

โค้ดข้างบนจะแสดงข้อความข้อความ Hello Javascript เพราะ ค่าสุดท้ายของการประมวลผลคือ Hello Javascript

* operator || จะreturn ตัวหลังถ้าตัวแรกเป็น false

เช่น

console.log(false || 'Hello Javascript');

จะได้ Hello Javascript เพราะค่าสุดท้ายของการประมวลผลคือ Hello Javascript เหมือนกัน


##ข้อควรระวัง var a = 0; a++; ++a; console.log(false && ++a); console.log(true || ++a); console.log(a); code ข้างต้นจะไม่ทำ ++a เลย เพราะมี Short-circuit evaluation (ค่าสุดท้ายคือ fasle เพราะว่า false AND กับอะไรก็ได้ false เลยไม่ต้องคำนวณต่อ เนี่ยแหละกระบวนการ Short-circuit)


การนำ operator && และ operator || ไปใช้

operator &&

var name = person && person.getName(); code ข้างบน จะเหมือนกับ

if(person) {
  var name = person.getName();
}
/* ส่วนใหญ่จะใช้กับการตรวจสอบ object ว่ามีจริงไหม แล้วค่อยดึงค่าออกมาใช้ */

operator ||

var name = persons_name || "John Doe"; code ข้างบน จะเหมือนกับ

if(persons_name) {
  var name = persons_name;
} else {
  var name = "John Doe";
}
/* ส่วนใหญ่จะใช้กับการ set ค่า default */

กระบวนการ Short-circuit evaluation มีอยู่ในหลายภาษาซึ่งแต่ละภาษา return ค่าหลังจากประมวลผลต่างกัน

Short circuit operators ในภาษาต่างๆ

Short Circuit-Evaluation

แหล่งข้อมูลอ้างอิง/เพิ่มเติม

ดาวน์โหลด Youtube Vdo แบบ Geek (นิดๆ) –python

วันนี้ยังไง?

เราจะมา download youtube vdo ด้วยคำสั่ง (command line) กันครับ คำสั่งที่เราจะใช้ก็คือ youtube-dl ซึ่งก็ตรงๆตัว ครับ

youtube-dl is a small command-line program to download videos from YouTube.com