TypeError: การเรียกใช้ที่ผิดกฎหมายบน console.log.apply


129

หากคุณเรียกใช้สิ่งนี้ในคอนโซล Chrome:

console.log.apply(null, [array])

Chrome ให้ข้อผิดพลาดกลับมา:

// TypeError: Illegal Invocation

ทำไม? (ทดสอบบน Chrome 15 ผ่าน OSX)

คำตอบ:


180

อาจใช้ไม่ได้ในกรณีที่บริบทการดำเนินการเปลี่ยนจากคอนโซลเป็นอ็อบเจ็กต์อื่น:

คาดว่าเนื่องจาก console.info คาดว่าการอ้างอิง "this" จะเป็นคอนโซลไม่ใช่หน้าต่าง

console.info("stuff")
stuff
undefined
console.info.call(this, "stuff")
TypeError: Illegal invocation
console.info.call(console, "stuff")
stuff
undefined

คาดว่าพฤติกรรมนี้

https://bugs.chromium.org/p/chromium/issues/detail?id=48662


25
หากคุณต้องการใช้เป็นฟังก์ชันคุณสามารถใช้ console.info.bind (คอนโซล)
John Williams

3
คุณสามารถใช้console.info.call(console, "stuff")กับเบราว์เซอร์ทั้งหมดที่รองรับ ES5 ได้หรือไม่
mucaho

2
ใช้เช่นเดียวกัน:console.info.apply(console, arguments)
PeterM

อาร์กิวเมนต์เดียวกันใช้กับฟังก์ชันอื่น ๆ เช่น console.log () และ document.writeln () ดังนั้นให้ระบุบริบทการดำเนินการที่ถูกต้องเสมอหากใช้ call () หรือ apply () อีกวิธีหนึ่งคือใช้ bind () ตามที่ @JohnWilliams ได้ชี้ให้เห็น
Alan CS

1
สิ่งนี้ยังคงใช้ได้กับ IE11 / Edge เมื่อไม่ได้เปิด DevTools F12
Benny Bottema
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.