บางทีเราอาจไม่มีทางรู้ว่าเส้นทางจะไปได้ไกลแค่ไหน มนุษย์สามารถบรรลุความสำเร็จได้มากแค่ไหน จนกว่าเราจะตระหนักว่ารางวัลสูงสุดไม่ใช่เหรียญทอง แต่เป็นเส้นทางนั้นเอง
― โดย จอร์จ ลีโอนาร์ด

สวัสดีชาวโลก; ยินดีต้อนรับสู่การเดินทางส่วนตัวของฉันสู่ความเชี่ยวชาญของ JS ชุดโพสต์บนบล็อกเหล่านี้เป็นบันทึกแบบเปิดเกี่ยวกับการเดินทางของฉันสู่ความเชี่ยวชาญของ JS และความเข้าใจในหัวข้อของ JS ฉันกำลังเขียนบล็อกชุดนี้เพื่อแบ่งปันสิ่งที่ฉันรู้และเรียนรู้จากคุณที่อ่านข้อความนี้ ฉันขอขอบคุณทุกคนที่สละเวลาอ่านบทความนี้ ถามคำถาม ให้ข้อเสนอแนะ แสดงความคิดเห็น และแบ่งปันกับเพื่อน หากฉันทำผิดพลาด ฉันมาที่นี่เพื่อเรียนรู้ ดังนั้นโปรดอย่าลังเลที่จะทิ้งบรรทัดหนึ่งหรือสองบรรทัดในส่วนความคิดเห็น

เช่นเดียวกับคำพูดของ George Leonard ฉันไม่รู้ว่าการเดินทางสู่ JS mastery จะต้องใช้ javascript เป็น javascript แค่ไหน หรือฉันสามารถบรรลุผลสำเร็จได้มากเพียงใด แต่รางวัลสูงสุดของการเดินทางครั้งนี้คือการเรียนรู้สิ่งใหม่ แบ่งปันสิ่งเหล่านั้น และปรับปรุงงานฝีมือของฉัน

การเดินทางของฉันเริ่มต้นด้วยการอธิบายว่า Javascript คืออะไรและไม่ใช่ จากนั้นมุ่งหน้าไปยังหัวข้อต่างๆ เช่น Call Stacks , Execution Contexts , High Order Functions , Call Backs , Call Back Queues, Event Loop, Async., Object Oriented javascript , Promises , Iterators , Generators , รูปแบบการออกแบบ การเขียนโปรแกรมเชิงฟังก์ชัน และหัวข้ออื่นๆ ฉันเชื่อว่าฉันจะค้นพบอะไรอีกมากมายในระหว่างการเดินทางและจะมีอะไรให้แบ่งปันอีกมากมาย

มาเริ่มต้นการเดินทางของเรากันเถอะ

JavaScript คืออะไรและไม่ใช่อะไร

JavaScript เป็นภาษาการเขียนโปรแกรมที่ต้องการสภาพแวดล้อมในการทำงาน (สภาพแวดล้อมรันไทม์) และสภาพแวดล้อมนั้นอาจเป็น Chrome , IE , Safari , Node.JS หรือ Adobe Acrobat ซึ่งหนึ่งในนั้นสามารถเขียนได้โดยใช้ C, C++, C#,Go ,… . ต่างจากภาษาการเขียนโปรแกรมส่วนใหญ่ Javascript โดยตัวมันเองไม่มีอะไรเลยหากไม่มีสภาพแวดล้อม ไม่มีแนวคิดเรื่องอินพุตหรือเอาต์พุต แต่ออกแบบมาเพื่อทำงานในสภาพแวดล้อมโฮสต์และสภาพแวดล้อมนั้นมีกลไกในการสื่อสารและการโต้ตอบกับโลกภายนอก

ดังนั้น เมื่อเรียนรู้ javascript การระบุองค์ประกอบต่างๆ ของ javascript รวมถึงระบบนิเวศและขอบเขตระหว่าง javascript กับสภาพแวดล้อมโดยรอบจึงเป็นสิ่งสำคัญ

ตัวอย่างที่ดีในการระบุความแตกต่างระหว่าง JS และสภาพแวดล้อมคือ ตัวจับเวลา ซึ่งจัดทำโดยสภาพแวดล้อม แต่ไม่ใช่จาวาสคริปต์ การแยกแยะสิ่งนี้เป็นสิ่งสำคัญ หาก javascript จัดเตรียมตัวจับเวลาที่มีลักษณะเป็นเธรดเดียว มันจะเป็นปัญหาสำคัญเนื่องจากการนับเวลาเป็นกิจกรรมการบล็อก การเรียนรู้เกี่ยวกับการดำเนินการแบบอะซิงโครนัสใน JS และวิธีการดำเนินการนั้นควบคู่ไปกับการทำความเข้าใจและระบุขอบเขตของจาวาสคริปต์และสภาพแวดล้อมที่ทำงานอยู่

ระบบนิเวศของจาวาสคริปต์ประกอบด้วย 3 ส่วนสำคัญ:

ภาษาจาวาสคริปต์ :

JavaScript เป็นภาษาสคริปต์เชิงวัตถุข้ามแพลตฟอร์มพร้อม "ฟังก์ชันชั้นหนึ่ง" มันเป็น ภาษาที่ใช้ต้นแบบ ที่เป็นไดนามิกและรองรับรูปแบบการเขียนโปรแกรมเชิงวัตถุ ความจำเป็น และเชิงฟังก์ชัน JavaScript ประกอบด้วยไลบรารีมาตรฐานของออบเจ็กต์ เช่น Array, Date และ Math และชุดหลักขององค์ประกอบภาษา เช่น ตัวดำเนินการ โครงสร้างการควบคุม และคำสั่ง Core JavaScript สามารถขยายเพื่อวัตถุประสงค์ที่หลากหลายได้โดยการเสริมด้วยอ็อบเจ็กต์เพิ่มเติม

เครื่องมือ JavaScript :

เอ็นจิ้น JavaScript คือโปรแกรมหรือตัวแปลที่ คอมไพล์ และ รัน โค้ดจาวาสคริปต์ จัดการการจัดสรรหน่วยความจำสำหรับวัตถุและดำเนินการ การรวบรวมขยะบนวัตถุที่ไม่ต้องการอีกต่อไป เรามีเอ็นจิ้นจาวาสคริปต์ที่แตกต่างกันและใช้งานอยู่จำนวนหนึ่ง:

  • Spider Monkey: พัฒนาโดย Mozilla และเขียนด้วยภาษา C && C++
  • Rhino : พัฒนาโดย Mozilla และเขียนด้วยภาษา Java
  • จักระ: พัฒนาโดย Microsoft และใช้ใน IE และ Microsoft Edge
  • Javascript Core (Nitro) :พัฒนาโดย Apple และใช้ใน Safari
  • Google V8:เขียนโดยใช้ C++ และใช้โดย Chrome , NodeJs

เอ็นจิ้น JS ส่วนใหญ่ใช้ประโยชน์จากการคอมไพล์ "Just In Time" ซึ่งเป็นลูกผสมระหว่างการคอมไพล์และการตีความระหว่างรันไทม์ ความหมายโดยพื้นฐานคือคอมไพเลอร์ของเราดำเนินการ ณ รันไทม์แทนที่จะทำบางอย่างเช่นสิ่งที่ WebPack ทำในที่ที่เรามีเอกสารต้นฉบับของเรา และเราดู WebPack สร้างเอกสารอื่นซึ่งมีโค้ดที่ต้องการแยกออกมา แม้ว่า webPack จะเป็นทรานสไพเลอร์และไม่ใช่คอมไพเลอร์เนื่องจากไม่ได้แยกภาษาระดับล่างออกมาซึ่งโดยทั่วไปจะเป็นไบนารีของรหัสเครื่อง

สภาพแวดล้อม :

สภาพแวดล้อม จัดเตรียม API ที่แตกต่างกันให้กับ Javascript เช่น DOM api, device apis, apis การสื่อสาร, apis การจัดการข้อมูล, ตัวจับเวลา และอื่นๆ อีกมากมาย สภาพแวดล้อมจัดเตรียม JavaScript พร้อมด้วย API ที่อนุญาตให้กลายเป็นจาวาสคริปต์ฝั่งไคลเอ็นต์ในกรณีของเว็บเบราว์เซอร์และจาวาสคริปต์ฝั่งเซิร์ฟเวอร์ในกรณีของ Node.JS ในกรณีของสภาพแวดล้อมฝั่งไคลเอ็นต์ สภาพแวดล้อมจะมอบ API ให้เราเพื่อเข้าถึง DOM และเชื่อมต่อกับ อินเทอร์เน็ตและอื่นๆ ; ในขณะที่ในกรณีของ API ฝั่งเซิร์ฟเวอร์ พวกเขาให้สิทธิ์ในการเข้าถึงระบบไฟล์ ….

แนวทางแบบเลเยอร์ที่ดำเนินการโดยระบบนิเวศของจาวาสคริปต์นั้นเป็นสาเหตุที่ทำให้ภาษาจาวาสคริปต์มีประสิทธิภาพ ตัวอย่างเช่น กลไกจาวาสคริปต์ V8 ถูกใช้โดยทั้งสภาพแวดล้อมฝั่งไคลเอ็นต์ (Chrome) และสภาพแวดล้อมฝั่งเซิร์ฟเวอร์ (Node.js) หากมีสภาพแวดล้อมใหม่ในวันพรุ่งนี้และเราต้องการที่จะเรียกใช้โค้ดจาวาสคริปต์ของเราบนนั้น เราสามารถนำเอ็นจิ้นที่มีอยู่ของเรามาใช้หรือเราสามารถเสียบปลั๊กและเล่นเอ็นจิ้นใหม่ซึ่งสามารถนำมาใช้โดยสภาพแวดล้อมปัจจุบันได้เช่นกัน

ด้ายเดี่ยว

ภาษาการเขียนโปรแกรมคือคำศัพท์และชุดของกฎไวยากรณ์สำหรับสั่งคอมพิวเตอร์หรืออุปกรณ์คอมพิวเตอร์ให้ทำงานเฉพาะอย่างในขณะที่ยังคงสื่อสารคำศัพท์และไวยากรณ์เหล่านั้นไปยังโปรแกรมเมอร์ในรูปแบบที่มนุษย์สามารถอ่านได้ รูปร่าง. คำว่า ภาษาการเขียนโปรแกรม มักจะหมายถึง ภาษา ระดับสูง และ JavaScript ก็คือภาษาหนึ่ง

ตัวอย่างเช่น หนึ่งในไวยากรณ์ที่มีให้โดย JavaScript ก็คือ คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่และใช้ชุดอักขระ unicode ไวยากรณ์อีกประการหนึ่งที่ให้ไว้คือ const ซึ่งประกาศค่าคงที่ที่มีการกำหนดขอบเขตแบบบล็อกและอ่านอย่างเดียว ในทำนองเดียวกัน JavaScript ได้ สันนิษฐานเบื้องต้นว่าโค้ด JavaScript ถูกเรียกใช้งานในเธรดเดียวของการดำเนินการ(เช่น ทีละบรรทัดทีละขั้นตอน ทีละขั้นตอน) หรือเรียกใช้ในเธรดเดียว

ข้อมูลจำเพาะภาษา JavaScript ของเรายังตั้งสมมติฐานเกี่ยวกับวิธีการทำงานของเอ็นจิ้นของเรา และจัดเตรียมไวยากรณ์เพิ่มเติมด้วยคีย์เวิร์ด async ซึ่งถือว่าเอ็นจิ้น JavaScript จะให้การใช้งานลูปเหตุการณ์เพื่อรันโค้ด JS ในลักษณะที่ไม่มีการบล็อก

โดยสรุป ลักษณะเธรดเดี่ยวของ JavaScript อยู่ในการออกแบบของภาษาและไม่ได้อยู่ในเอ็นจิ้นหรือสภาพแวดล้อมที่ใช้งาน มันเป็นเพียงจาวาสคริปต์ที่ดำเนินการโดย V8 หรือทำงานในสภาพแวดล้อม Node.js เท่านั้นที่รันเธรดเดี่ยว แต่เอ็นจิ้นหรือ สภาพแวดล้อมสามารถทำงานได้ตามข้อกำหนดของภาษาที่เขียน

สรุป :

JavaScript เป็นเพียงสคริปต์ ซึ่งเป็นภาษาการเขียนโปรแกรม และต้องการสภาพแวดล้อมที่มีเอ็นจิ้น JavaScript เพื่อดำเนินการและรัน ทุกสิ่งที่เราสามารถทำได้ด้วย JavaScript เช่น การเข้าถึงอินเทอร์เน็ต การอ่านไฟล์ ล้วนถูกเปิดใช้งานโดยสภาพแวดล้อมที่มันทำงานอยู่ และ JavaScript เป็นเพียงภาษาในการเข้าถึง API เหล่านั้น ดังนั้นเมื่อผู้คนพูดถึง JavaScript มันมักจะเกี่ยวกับภาษา ความสามารถของเอ็นจิ้นและสภาพแวดล้อมที่ทำงานในที่เดียว

ในที่สุด ในโลกที่ JavaScript ทำงานอยู่ทุกหนทุกแห่ง ฉันเชื่อว่าการรู้ถึงความแตกต่างของสามเลเยอร์จะช่วยให้เราเข้าใจโลกที่กล้าหาญของ JavaScript ได้ดีขึ้น