2019
TL; DR
eval ผู้ประกอบการสามารถเรียกใช้การแสดงออกของสตริงในบริบทที่เรียกว่าและกลับตัวแปรจากบริบทนั้น
literal objectในทางทฤษฎีสามารถทำได้โดยการเขียน: {[varName]}แต่มันถูกบล็อกโดยคำจำกัดความ
ดังนั้นฉันจึงเจอคำถามนี้และทุกคนที่นี่ก็แค่เล่นโดยไม่ต้องใช้ทางออกที่แท้จริง แต่ @Axel Heider มีวิธีการที่ดี
evalการแก้ปัญหาคือ ผู้ประกอบการที่ถูกลืมมากที่สุด (คิดว่าส่วนใหญ่เป็นwith())
evalผู้ประกอบการสามารถเรียกใช้การแสดงออกแบบไดนามิกในบริบทที่เรียกว่า และส่งคืนผลลัพธ์ของนิพจน์นั้น เราสามารถใช้มันเพื่อคืนค่าตัวแปรในบริบทของฟังก์ชัน
ตัวอย่าง:
function exmaple1(){
var a = 1, b = 2, default = 3;
var name = 'a';
return eval(name)
}
example1() // return 1
function example2(option){
var a = 1, b = 2, defaultValue = 3;
switch(option){
case 'a': name = 'a'; break;
case 'b': name = 'b'; break;
default: name = 'defaultValue';
}
return eval (name);
}
example2('a') // return 1
example2('b') // return 2
example2() // return 3
โปรดทราบว่าฉันมักจะเขียนอย่างชัดเจนการแสดงออกevalจะทำงาน เพื่อหลีกเลี่ยงความประหลาดใจที่ไม่จำเป็นในรหัส evalแข็งแรงมาก
แต่ฉันแน่ใจว่าคุณรู้แล้ว
BTW ถ้ามันถูกกฎหมายเราสามารถใช้literal objectเพื่อจับชื่อตัวแปรและค่า แต่เราไม่สามารถรวมชื่อคุณสมบัติที่คำนวณและค่าย่อของคุณสมบัติที่น่าเศร้าไม่ถูกต้อง
functopn example( varName ){
var var1 = 'foo', var2 ='bar'
var capture = {[varName]}
}
example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`