เหตุผลในการเขียน:
เมื่อเขียนฟังก์ชั่นใน JS เรามักจะประกาศฟังก์ชั่นในรูปแบบของฟังก์ชันการประชุม fn () {} เมื่ออ่านปลั๊กอินที่ยอดเยี่ยมเราไม่สามารถช่วยได้ แต่เห็นการสร้างฟังก์ชั่นเช่น var fn = function () {} อะไรคือความแตกต่างระหว่างพวกเขา? วันนี้เราจะพูดคุยเกี่ยวกับคำแถลงฟังก์ชั่นที่น่าสนใจนี้ในจิตวิญญาณของการทำลายหม้อตุ๋นจนถึงที่สุด
การประกาศฟังก์ชั่น
รหัสตัวอย่างการประกาศฟังก์ชั่น
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น fn () {
console.log ('Fn Function Execution .. ');
// รหัส ..
-
ด้วยวิธีนี้เราประกาศฟังก์ชั่นชื่อ FN นี่คือความคิด คุณคิดว่ามันจะถูกดำเนินการหรือไม่หากเรียกใช้ฟังก์ชันนี้? หรือจะรายงานข้อผิดพลาด?
fn (); // เรียกฟังก์ชัน FN ที่เราประกาศไว้ก่อนหน้านี้
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น fn () {
console.log ('Fn Function Execution .. ');
// รหัส ..
-
ผลการออกคอนโซล:
ใช่ฟังก์ชัน FN สามารถเรียกได้ในเวลานี้ดังนั้นขอสรุปเหตุผลที่นี่
สรุป:
1: ในเวลานี้ฟังก์ชั่น FN เป็นผลมาจากตัวแปรและถูกเก็บไว้ในตัวแปรในบริบทส่วนกลางโดยค่าเริ่มต้น (สามารถตรวจสอบได้โดยหน้าต่างชื่อฟังก์ชั่น)
2: วิธีนี้คือการประกาศฟังก์ชั่นและมีอยู่แล้วเมื่อเข้าสู่ขั้นตอนบริบททั่วโลกและเข้าสู่ขั้นตอนการดำเนินการรหัส PS: JavaScript จะเริ่มต้นสภาพแวดล้อมบริบททุกครั้งที่เข้าสู่วิธีการ (จาก Global → Local)
3: มันอาจส่งผลกระทบต่อวัตถุตัวแปร (เฉพาะผลกระทบต่อตัวแปรที่เก็บไว้ในบริบท)
การแสดงออกของฟังก์ชั่น
รหัสตัวอย่างฟังก์ชั่น
การคัดลอกรหัสมีดังนี้:
var fn = function () {
console.log ('fn function [นิพจน์] ประกาศการดำเนินการ ... ')
// รหัส ..
-
ดังนั้นเราจึงประกาศฟังก์ชั่นที่ไม่ระบุชื่อและชี้การอ้างอิงไปยังตัวแปร FN?
เรียกอีกครั้งว่าด้านบนและด้านล่างฟังก์ชั่นที่ประกาศโดยนิพจน์นี้เพื่อดูผลลัพธ์ผลลัพธ์ของคอนโซล
การคัดลอกรหัสมีดังนี้:
// เพื่อที่จะเห็นผลลัพธ์ของคอนโซลอย่างชัดเจนเราทำเครื่องหมายก่อนและหลังการโทรแต่ละครั้งเพื่อเพิ่มความสามารถในการอ่าน
console.log ('ก่อนการโทรเริ่ม ... ');
fn ();
console.log ('การโทรก่อนหน้านี้สิ้นสุดลง ... ');
var fn = function () {
console.log ('fn function [นิพจน์] ประกาศการดำเนินการ ... ')
// รหัส ..
-
console.log ('การโทรเริ่มต้นหลังจากนั้น ... ');
fn ();
console.log ('การโทรเริ่มต้นหลังจากนั้น ... ');
ผลการพิมพ์คอนโซล:
คุณจะเห็นว่าเมื่อรหัสถูกเรียกใช้เป็นครั้งแรกเมื่อเรียกใช้ฟังก์ชัน FN (), พรอมต์คือ: FN ไม่ใช่ฟังก์ชัน (FN ไม่ใช่วิธี) และการดำเนินการจะถูกยกเลิกเมื่อพบข้อผิดพลาด
สิ่งนี้แสดงให้เห็นว่าเมื่อมีการเรียก FN () เป็นครั้งแรกตัวแปร VAR FN ไม่ได้เป็นคุณสมบัติของวัตถุทั่วโลกและบริบทฟังก์ชันที่ไม่ระบุชื่อที่อ้างอิงโดย FN ไม่ได้เริ่มต้นดังนั้นการโทรจึงล้มเหลวก่อน
การคัดลอกรหัสมีดังนี้:
// ตอนนี้แสดงความคิดเห็นเกี่ยวกับตรรกะการโทรก่อนหน้าก่อนจากนั้นดูที่เอาต์พุตคอนโซล
// console.log ('ก่อนการโทรเริ่ม ... ');
// fn ();
// console.log ('การโทรก่อนหน้านี้สิ้นสุดลง ... ');
var fn = function () {
console.log ('fn function [นิพจน์] ประกาศการดำเนินการ ... ')
// รหัส ..
-
console.log ('การโทรเริ่มต้นหลังจากนั้น ... ');
fn (); // เรียกหลังจากนิพจน์
console.log ('การโทรเริ่มต้นหลังจากนั้น ... ');
ผลการพิมพ์คอนโซล:
จะเห็นได้ว่ามันโอเคที่จะเรียกฟังก์ชั่นนิพจน์หลังจากนั้น มาสรุปว่าทำไม?
สรุป:
1: ก่อนอื่นตัวแปรนั้นไม่มีอยู่เป็นฟังก์ชัน แต่เป็นการอ้างอิงถึงฟังก์ชันที่ไม่ระบุชื่อ (ประเภทค่าไม่ได้อยู่ในการอ้างอิง)
2: ในระหว่างขั้นตอนการดำเนินการรหัสเมื่อเริ่มต้นบริบททั่วโลกมันไม่ได้เป็นแอตทริบิวต์ทั่วโลกดังนั้นมันจะไม่ทำให้เกิดการปนเปื้อนของวัตถุตัวแปร
3: การประกาศประเภทนี้โดยทั่วไปเป็นเรื่องธรรมดาในการพัฒนาปลั๊กอินและยังสามารถใช้เป็นฟังก์ชันการโทรกลับในการปิด
ดังนั้นฟังก์ชัน fn () {} ไม่เท่ากับ var fn = function () {} พวกเขามีความแตกต่างที่สำคัญ