ความแตกต่างระหว่าง(1,eval)และเก่าธรรมดาevalคืออดีตเป็นค่านิยมและหลังเป็นค่าลอว์ จะชัดเจนยิ่งขึ้นหากเป็นตัวระบุอื่น ๆ :
var x;
x = 1;
(1, x) = 1;
นั่นคือ(1,eval)คือการแสดงออกที่อัตราผลตอบแทนeval(เช่นเดียวกับที่พูด(true && eval)หรือ(0 ? 0 : eval)จะ) evalแต่ก็ไม่ได้มีการอ้างอิงถึง
จะแคร์ทำไม
ดี Ecma ข้อมูลจำเพาะพิจารณาอ้างอิงเพื่อevalให้เป็น "โทร EVAL โดยตรง" แต่การแสดงออกว่าเป็นเพียงผลตอบแทนถัวเฉลี่ยevalที่จะเป็นหนึ่งในทางอ้อม - และบริการโทร EVAL อ้อมมีการรับประกันในการดำเนินการในขอบเขตทั่วโลก
สิ่งที่ฉันยังไม่รู้:
- การเรียกการประเมินโดยตรงไม่ดำเนินการในขอบเขตทั่วโลกภายใต้สถานการณ์ใด
- ภายใต้สถานการณ์ใดที่
thisฟังก์ชันของฟังก์ชันในขอบเขตส่วนกลางจะไม่ส่งผลต่อวัตถุส่วนกลาง
ข้อมูลบางอย่างมากขึ้นสามารถรวบรวมได้ที่นี่
แก้ไข
เห็นได้ชัดว่าคำตอบสำหรับคำถามแรกของฉันคือ "เกือบตลอดเวลา" evalดำเนินการโดยตรงจากขอบเขตปัจจุบัน พิจารณารหัสต่อไปนี้:
var x = 'outer';
(function() {
var x = 'inner';
eval('console.log("direct call: " + x)');
(1,eval)('console.log("indirect call: " + x)');
})();
ไม่น่าแปลกใจ (heh-heh) สิ่งนี้พิมพ์ออกมา:
direct call: inner
indirect call: outer
แก้ไข
หลังจากการทดลองมากขึ้นผมกำลังจะไปชั่วคราวบอกว่าthisไม่สามารถกำหนดให้หรือnull undefinedมันสามารถตั้งค่าให้ค่า falsy อื่น ๆ (0, '', น่านเท็จ) แต่มากจงใจ
ฉันจะบอกว่าแหล่งที่มาของคุณกำลังทุกข์ทรมานจากการผกผันของกะโหลกและทวารหนักที่ไม่รุนแรงและย้อนกลับได้และอาจต้องการพิจารณาใช้เวลาหนึ่งสัปดาห์ในการเขียนโปรแกรมใน Haskell