ความแตกต่างระหว่าง(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