ใน JavaScript คุณสามารถใช้ฟังก์ชั่น eval () เพื่อแยกวิเคราะห์รหัส JavaScript ในสตริงและส่งคืนผลการดำเนินการรหัสที่เกี่ยวข้อง:
การคัดลอกรหัสมีดังนี้:
console.log (eval ("42 * 2")); // 84
evals () เป็นฟังก์ชั่นของวัตถุ Global JavaScript ตัวอย่างเช่นรหัสข้างต้นเทียบเท่ากับ:
การคัดลอกรหัสมีดังนี้:
console.log (this.eval ("42 * 2")); // 84
อย่างไรก็ตามเมื่อใช้คำสั่ง eval () วิธีแรกที่กล่าวถึงข้างต้นจะถูกนำมาใช้โดยทั่วไปนั่นคือละเว้นวัตถุทั่วโลกและใช้ eval () โดยตรง
การใช้ Eval ()
ด้วยเหตุผลสองประการต่อไปนี้เว้นแต่ว่าคุณต้องการมันจริงๆคุณควรพยายามหลีกเลี่ยงการใช้คำสั่ง eval () ในรหัสของคุณ:
1. การพูดอย่างมีเหตุผลควรใช้สตริงเพื่อจัดเก็บเนื้อหาและข้อมูลระหว่างการดำเนินการโปรแกรมแทนที่จะจัดเก็บตรรกะการคำนวณเฉพาะ
2. เนื่องจากพารามิเตอร์ eval () เป็นสตริงและไม่สามารถเป็นคำศัพท์สำหรับชิ้นส่วนของสตริง JavaScript Interpreter ไม่สามารถปรับให้เหมาะสมสำหรับคำสั่งการเรียก Eval ()
ค่าส่งคืนของ eval ()
ค่าส่งคืนของ eval () เป็นไปตามกฎต่อไปนี้:
1. หากพารามิเตอร์ของ eval () ไม่ใช่สตริง eval () จะส่งคืนพารามิเตอร์โดยตรง
2. หากพารามิเตอร์ของ eval () เป็นสตริงแล้ว Eval () จะแยกวิเคราะห์สตริงลงในรหัสและดำเนินการและส่งคืนผลลัพธ์ของบรรทัดสุดท้ายของการดำเนินการรหัส
3. หากสตริงไม่สามารถแยกวิเคราะห์เป็นรหัสที่ถูกต้องได้ Eval () จะส่งข้อผิดพลาดไวยากรณ์
4. หากสตริงสามารถแยกวิเคราะห์เป็นรหัสทางกฎหมายได้ แต่มีการรายงานข้อผิดพลาดระหว่างการดำเนินการรหัสนี้จะมีการรายงานข้อผิดพลาดไปยังคำสั่ง eval () และโยนโดย eval ()
การคัดลอกรหัสมีดังนี้:
console.log (eval ([1,2,3])); // [1, 2, 3]
console.log (typeof eval ([1,2,3])); // วัตถุ
console.log (eval ("42 */2")); // syntaxerror
console.log (eval ("42 * 2; 22 * 3;")); // 66 Eval ส่งคืนผลลัพธ์ของนิพจน์/คำสั่งสุดท้าย
console.log (eval ("null.toString ()")); // typeError, ข้อยกเว้นในรหัสประเมินจะถูกเผยแพร่นอก eval ()
สภาพแวดล้อมที่ผันแปร
evaln () ใน JavaScript มีคุณลักษณะที่สำคัญ: รหัสในสตริงพารามิเตอร์ eval () สามารถเข้าถึงตัวแปรในรหัสภายนอกและยังสามารถเปิดเผยตัวแปรที่สร้างขึ้นใหม่ในรหัสสตริงพารามิเตอร์ไปยังรหัสภายนอก นั่นคือถ้าสตริงพารามิเตอร์ eval () สามารถแยกวิเคราะห์ได้อย่างถูกต้องตามกฎหมาย JS จะแทนที่รหัสแยกวิเคราะห์ด้วยบรรทัดที่ Eval () อยู่:
การคัดลอกรหัสมีดังนี้:
// สภาพแวดล้อมตัวแปร
var a = 108;
console.log (eval ("ฟังก์ชั่น double (x) {return x*2;} a = double (a)"));
console.log (a); // 216
console.log (double (33)); // 66
เป็นที่น่าสังเกตว่าข้อกำหนดเบื้องต้นสำหรับการใช้คุณสมบัติข้างต้นคือรหัสในสตริงพารามิเตอร์ Eval () สามารถแยกวิเคราะห์ได้อย่างถูกกฎหมาย นอกเหนือจากการแก้ไขไวยากรณ์ของรหัสแล้ว JS ยังต้องการให้รหัสในสตริงพารามิเตอร์ eval () ต้องเป็น "การจัดระเบียบตนเอง": รหัสจะต้องสมเหตุสมผลในแง่ของรหัสในสตริงพารามิเตอร์ ตัวอย่างเช่นมันเป็นไปไม่ได้ที่จะผ่านสตริงเช่น "return;" ไปยังฟังก์ชั่น eval ():
การคัดลอกรหัสมีดังนี้:
ฟังก์ชั่นทดสอบ () {
var s = "ทดสอบ";
eval ("return s;");
-
test (); // syntaxerror: return ไม่ได้อยู่ในฟังก์ชัน
หากคุณใช้ฟังก์ชั่น eval () โดยตรงตัวแปรที่เข้าถึงได้โดยรหัสในสตริงพารามิเตอร์ eval () คือตัวแปรเหล่านั้นในฟังก์ชันที่คำสั่ง everit () อยู่นั่นคือสภาพแวดล้อมตัวแปรที่ใช้โดยฟังก์ชัน Eval () คือ "สภาพแวดล้อมตัวแปรท้องถิ่น" หากคุณไม่ได้ใช้ฟังก์ชัน evern () โดยตรง แต่ใช้ตัวแปรใหม่ที่ชี้ไปที่ฟังก์ชัน eval () จากนั้นตัวแปรที่เข้าถึงได้โดยรหัสในสตริงพารามิเตอร์ที่สอดคล้องกันคือตัวแปรส่วนกลางนั่นคือสภาพแวดล้อมตัวแปรที่ใช้โดยฟังก์ชัน Eval () คือ "สภาพแวดล้อมตัวแปรทั่วโลก"::
การคัดลอกรหัสมีดังนี้:
// สภาพแวดล้อมตัวแปรท้องถิ่นและสภาพแวดล้อมตัวแปรทั่วโลก
var เปลี่ยนชื่อ = eval;
var x = "ต้นกำเนิด", y = "ต้นกำเนิด";
ฟังก์ชั่น f () {
var x = "ใหม่";
eval ("x += 'เปลี่ยน';");
กลับ x;
-
ฟังก์ชั่น g () {
var y = "ใหม่";
เปลี่ยนชื่อ ("y += 'เปลี่ยน';");
กลับ y;
-
console.log (f (), x); // newchanged Origin
console.log (g (), y); // ใหม่ originchanged
อย่างไรก็ตามเป็นที่น่าสังเกตว่าพฤติกรรมใน IE6, 7 และ 8 นั้นแตกต่างกัน ใน IE6, 7 และ 8 แม้ว่าจะมีการเปลี่ยนฟังก์ชั่น eval () แต่ยังคงใช้ฟังก์ชั่น "สภาพแวดล้อมตัวแปรท้องถิ่น"