เมื่อดูที่ซอร์สโค้ดของเทมเพลต JavaScript ฉันพบว่ามีการใช้งานที่น่าสนใจในการสร้างฟังก์ชั่น นี่ไม่ใช่ metaprogramming ใช่ไหม
JavaScript Metaprogramming
การคัดลอกรหัสมีดังนี้:
Metaprogramming หมายถึงการเขียนโปรแกรมคอมพิวเตอร์บางประเภทที่เขียนหรือจัดการกับโปรแกรมอื่น ๆ (หรือตัวเอง) เป็นข้อมูลของพวกเขาหรือทำงานให้เสร็จสมบูรณ์บางส่วนที่ควรจะเสร็จสมบูรณ์ในเวลาคอมไพล์ที่รันไทม์
JavaScript Eval
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่น eval () คำนวณสตริงและดำเนินการรหัส JavaScript ในนั้น
อาจมีการใช้งานดังต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
evaler ("x = 10; y = 20; document.write (x*y)")
แน่นอนว่านี่เป็นเพียงการใช้งานฟังก์ชั่นบางอย่าง แต่ผลิตภัณฑ์นี้ราคาถูกและทำผิดพลาดง่าย
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นการประเมินควรหลีกเลี่ยงให้มากที่สุด
วิธีที่ดีกว่าคือการใช้ฟังก์ชั่นใหม่ ()
ความแตกต่างอย่างมากระหว่างการใช้ฟังก์ชันใหม่ () และ eval () คือการประเมินไม่ใช่แค่ฟังก์ชั่น
การคัดลอกรหัสมีดังนี้:
evaln () คำนวณสตริงเป็นนิพจน์ JavaScript ภายในขอบเขตการดำเนินการปัจจุบันช่วยให้สามารถเข้าถึงตัวแปรท้องถิ่น ฟังก์ชั่นใหม่ () การแยกวิเคราะห์รหัส JavaScript ที่เก็บไว้ในสตริงที่แปลงเป็นวัตถุฟังก์ชั่นและสามารถเรียกได้ เนื่องจากรหัสทำงานในขอบเขตแยกต่างหากจึงไม่สามารถเข้าถึงตัวแปรโลคัลได้
กล่าวอีกนัยหนึ่ง Eval () จะรบกวนขอบเขตของฟังก์ชันปัจจุบัน -
JavaScript Function ใหม่ ()
ตัวสร้างฟังก์ชั่นสร้างวัตถุฟังก์ชั่นใหม่ ใน JavaScript แต่ละฟังก์ชั่นเป็นวัตถุฟังก์ชัน วัตถุฟังก์ชั่นที่สร้างขึ้นโดยใช้ตัวสร้างฟังก์ชั่นจะถูกแยกวิเคราะห์เมื่อสร้างฟังก์ชั่น สิ่งนี้มีประสิทธิภาพน้อยกว่าการใช้การประกาศฟังก์ชั่นและเรียกพวกเขาในรหัสของคุณเนื่องจากฟังก์ชั่นที่ประกาศใช้คำสั่งฟังก์ชั่นจะแยกวิเคราะห์ด้วยข้อความอื่น ๆ
ฟังก์ชั่นใหม่ () ไม่มีประสิทธิภาพในการเปรียบเทียบซึ่งเป็นสิ่งที่เราสามารถคาดการณ์ได้ภายใต้สถานการณ์ปัจจุบัน
ตัวอย่างง่ายๆคือดังนี้:
การคัดลอกรหัสมีดังนี้:
var add = ฟังก์ชันใหม่ (['x', 'y'], 'return x + y');
ฟังก์ชั่นใหม่ () วิเคราะห์สตริงลงในฟังก์ชัน - จากนั้นเราสามารถดำเนินการได้โดยการสมัคร
การคัดลอกรหัสมีดังนี้:
function.apply (null, args)
และนี่คือสิ่งที่ฉันเห็นในเทมเพลต JavaScript:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นใหม่ (
tmpl.arg + ', tmpl'
"var _e = tmpl.encode" + tmpl.helper + ", _s = '"
str.replace (tmpl.regexp, tmpl.func) +
"'; return _s;"
-
แน่นอนว่าเรามีวิธีอื่น