คำก่อนหน้านี้
การประเมินและมักจะไม่ชอบราวกับว่าการดำรงอยู่ของพวกเขาเป็นความผิดพลาด ใน CSS ตารางไม่ชอบและใช้เฉพาะตารางเพื่อแสดงข้อมูลบนหน้าเว็บแทนที่จะเป็นเค้าโครงอาจถูกปฏิเสธว่าผิดปกติและถูกแก้ไขมากเกินไป แล้วสถานการณ์เกี่ยวกับการประเมินคืออะไร? บทความนี้จะแนะนำฟังก์ชั่น eval () และด้วยคำแถลงในรายละเอียด
การประเมิน
คำนิยาม
Eval () เป็นฟังก์ชั่นระดับโลก JavaScript ใช้ Eval () เพื่ออธิบายสตริงที่ทำงานซึ่งประกอบด้วยซอร์สโค้ด JavaScript
var result = eval ('3+2'); console.log (ผลลัพธ์, ผลลัพธ์ของ typeof); // 5 'number'การใช้งาน
evaler () มีพารามิเตอร์เดียวเท่านั้น หากพารามิเตอร์ที่ผ่านไม่ใช่สตริงมันจะส่งคืนพารามิเตอร์นี้โดยตรง หากพารามิเตอร์เป็นสตริงมันจะรวบรวมสตริงเป็นรหัส JavaScript หากการรวบรวมล้มเหลวข้อผิดพลาดทางไวยากรณ์ (ไวยากรณ์) จะถูกโยนทิ้ง หากการรวบรวมสำเร็จรหัสจะถูกดำเนินการและค่าของนิพจน์หรือคำสั่งสุดท้ายในสตริงจะถูกส่งคืนและหากนิพจน์หรือคำสั่งสุดท้ายไม่มีค่ามันจะส่งคืนที่ไม่ได้กำหนดในที่สุด หากสตริงโยนข้อยกเว้นข้อยกเว้นจะผ่านการโทรไปยัง eval ()
var num = 1; var str = 'test'; console.log (eval (num)); // 1console.log (eval (str)); // referenterror: การทดสอบไม่ได้กำหนด var strlong1 = 'var x = 1; var y = 2;' console.log x ++; '; console.log (eval (strlong2), x); // 1 2
ขอบเขต
eval -eval () ใช้สภาพแวดล้อมขอบเขตตัวแปรที่เรียกว่า นั่นคือมันมองหาค่าของตัวแปรและกำหนดการทำงานของตัวแปรใหม่และฟังก์ชั่นและรหัสในขอบเขตท้องถิ่น
var b = 2; function foo (str, a) {eval (str); console.log (a, b);} foo ('var b = 3;', 1); // 1 3นามแฝง
เมื่อเรียกผ่านนามแฝง Eval () จะเรียกใช้สตริงเป็นรหัสทั่วโลกระดับบนสุด รหัสที่ดำเนินการอาจกำหนดตัวแปรส่วนกลางและฟังก์ชั่นส่วนกลางใหม่หรือกำหนดค่าให้กับตัวแปรทั่วโลก แต่ไม่สามารถใช้หรือแก้ไขตัวแปรท้องถิ่นในฟังก์ชัน
var geval = eval; var x = 'global', y = 'global'; ฟังก์ชั่น f () {var x = 'local'; eval ('x += "เปลี่ยน";'); return x;} function g () {var y = 'local'; geval ('y += "เปลี่ยน";'); return y;} console.log (f (), x);[หมายเหตุ] IE8- เบราว์เซอร์เรียก eval () ผ่านนามแฝงและการโทร eval () ผลลัพธ์เดียวกัน
ผลข้างเคียง
ล่าม JavaScript ดำเนินการวิเคราะห์รหัสและการเพิ่มประสิทธิภาพจำนวนมาก ปัญหาเกี่ยวกับ Eval () คือรหัสที่ใช้สำหรับการดำเนินการแบบไดนามิกมักจะไม่ถูกวิเคราะห์ดังนั้นล่ามไม่สามารถปรับให้เหมาะสมซึ่งจะนำไปสู่การลดลงของประสิทธิภาพ
เช่นเดียวกับ evals () เป็น settimeout (), setInterval (), ฟังก์ชันใหม่ () ฯลฯ ฟังก์ชั่นเหล่านี้สามารถดำเนินการแบบไดนามิกเมื่อโปรแกรมทำงานโดยใช้สตริงเป็นพารามิเตอร์ ประโยชน์ของกลไกการดำเนินการนี้ไม่สามารถชดเชยการสูญเสียประสิทธิภาพได้ดังนั้นคุณควรพยายามหลีกเลี่ยงการใช้งาน
โหมดที่เข้มงวด
เนื่องจากฟังก์ชั่น eval () มีประสิทธิภาพเกินไปโหมดที่เข้มงวดจึง จำกัด อย่างเคร่งครัด
【 1 】ตัวแปรหรือฟังก์ชั่นไม่สามารถสร้างได้ผ่านฟังก์ชั่น eval () แต่ค่าของพวกเขาสามารถสอบถามและเปลี่ยนแปลงได้
'ใช้อย่างเข้มงวด'; eval ('var x = 1;'); console.log (x); // referenterror: x ไม่ได้กำหนด 'ใช้ความเข้มงวด'; var x = 1; eval ('x = 2;'); console.log (x); // 2【 2 】ไม่สามารถใช้ Eval เป็นตัวระบุได้
'ใช้อย่างเข้มงวด'; var eval = 10; // syntaxError: การประเมินหรืออาร์กิวเมนต์ที่ไม่คาดคิดในโหมดเข้มงวด
กับ
วัตถุประสงค์ของการกำหนดด้วยคำสั่งคือการทำให้การทำงานของการเขียนวัตถุเดียวกันง่ายขึ้นหลายครั้ง
คำสั่งด้วยเพิ่มวัตถุให้กับหัวของห่วงโซ่ขอบเขตจากนั้นดำเนินการคำสั่งและในที่สุดก็คืนค่าโซ่ขอบเขตให้อยู่ในสถานะเดิม
ด้วย (วัตถุ) {คำสั่ง;}ผล
เมื่อระดับการทำรังของวัตถุลึกโดยปกติจะใช้คำสั่งเพื่อทำให้การเขียนโค้ดง่ายขึ้น ในสาระสำคัญมันถูกประมวลผลโดยการอ้างอิงการอ้างอิงของวัตถุเป็นขอบเขตและใช้แอตทริบิวต์ของวัตถุเป็นตัวระบุในขอบเขตดังนั้นการสร้างขอบเขตคำศัพท์ใหม่
ในไคลเอน
document.forms [0] .address.value
หากนิพจน์ดังกล่าวปรากฏหลายครั้งในรหัสคุณสามารถใช้คำสั่งด้วยเพื่อเพิ่มวัตถุฟอร์มลงในระดับสูงสุดของห่วงโซ่ขอบเขต
ด้วย (document.forms [0]) {name.value = ''; address.value = ''; emai.value = '';}วิธีนี้จะช่วยลดการป้อนข้อมูลจำนวนมากโดยไม่ต้องนำหน้าเอกสารรูปแบบ [0] สำหรับแต่ละชื่อคุณสมบัติ วัตถุนี้ติดตั้งชั่วคราวบนห่วงโซ่ขอบเขต เมื่อ JavaScript จำเป็นต้องแยกวิเคราะห์ตัวระบุเช่นที่อยู่มันจะค้นหาในวัตถุนี้โดยอัตโนมัติ
[หมายเหตุ] คำสั่งด้วยมีทางลัดเพื่ออ่านคุณสมบัติของวัตถุ แต่ไม่สามารถสร้างคุณสมบัติของวัตถุ
หาก Object O มีแอตทริบิวต์ x รหัสต่อไปนี้จะกำหนดค่าแอตทริบิวต์ให้กับ 1
var o = {x: 0}; ด้วย (o) x = 1; console.log (ox); // 1หากไม่มีแอตทริบิวต์ x ถูกกำหนดใน O รหัสต่อไปนี้จะเหมือนกับรหัส x = 1 ที่ไม่ได้ใช้คำสั่งด้วย นี่เป็นเพราะการสืบค้น LHS ดำเนินการกับตัวแปร x และ 1 ถูกกำหนดให้กับมัน
var o = {}; ด้วย (o) x = 1; console.log (ox); // undefinedConsole.log (x); // 1ผลข้างเคียง
เช่นเดียวกับ Eval รหัส JavaScript ของคำสั่งด้วยนั้นยากที่จะปรับให้เหมาะสมและยังทำให้เกิดปัญหาในการดีบักรหัส ช้ากว่ารหัสที่ไม่ได้ใช้คำสั่งด้วย
ยิ่งไปกว่านั้นหากคำสั่งที่ไม่เหมาะสมอาจทำให้เกิดการรั่วไหลของตัวแปรและก่อให้เกิดมลพิษในขอบเขตทั่วโลก
var x = 1; var o = {}; ด้วย (o) {x = 2;} console.log (x); // 2console.log (ox); // undefinedโหมดที่เข้มงวด
ในโหมดที่เข้มงวดห้ามใช้คำสั่งด้วยคำสั่ง
// syntaxError: รหัสโหมดที่เข้มงวดอาจไม่รวม A พร้อมคำสั่ง Strict '; var o = {}; ด้วย (o) {x = 2;}ในที่สุด
การใช้ Eval และทำให้เครื่องยนต์เป็นไปไม่ได้ที่จะปรับการค้นหาขอบเขตในเวลาคอมไพล์ทำให้เกิดการลดลงของประสิทธิภาพและการทำงานของรหัสที่ช้าลง เนื่องจากการประเมินและมีการใช้งานจริงในงานจริงข้อ จำกัด ภายใต้โหมดที่เข้มงวดมีผลกระทบเพียงเล็กน้อยต่อเรา เช่นเดียวกับกระทรวงการต่างประเทศที่ออกประกาศวันหนึ่งว่าประเทศของเราจะไม่ออกวีซ่าไปยังจาเมกาอีกต่อไป แม้ว่าเราเคยได้ยินเกี่ยวกับจาเมกา แต่คนส่วนใหญ่อาจไม่ไปที่นั่นครั้งเดียวในชีวิตของพวกเขาดังนั้นมันจึงไม่สำคัญ ในทำนองเดียวกันมันไม่สำคัญว่าการประเมินและไม่ชอบหรือไม่
ข้างต้นเป็นคำอธิบายโดยละเอียดเกี่ยวกับสรุปการเรียนรู้ JavaScript ที่บรรณาธิการแนะนำให้คุณทราบเกี่ยวกับฟังก์ชั่นการประเมินและด้วยตัวอย่างคำสั่ง ฉันหวังว่ามันจะเป็นประโยชน์กับคุณ หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับคุณทันเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!