มีบางสิ่งที่เป็นไปไม่ได้ที่จะทำใน JS โดยไม่ต้องมีฟังก์ชั่น EVAL-ชอบ ( eval
, Function
และบางทีอาจจะมากกว่า)
ใช้apply
ตัวอย่างเช่น มันใช้งานง่ายเมื่อใช้กับการเรียกใช้ฟังก์ชันทั่วไป:
foo.apply(null, [a, b, c])
แต่คุณจะทำสิ่งนี้กับวัตถุที่คุณสร้างด้วยไวยากรณ์ใหม่ได้อย่างไร
new Foo.apply(null, [a, b, c])
ไม่ทำงานหรือทำแบบฟอร์มที่คล้ายกัน
แต่คุณสามารถหลีกเลี่ยงข้อ จำกัด นี้ผ่านeval
หรือFunction
(ฉันใช้Function
ในตัวอย่างนี้):
Function.prototype.New = (function () {
var fs = [];
return function () {
var f = fs[arguments.length];
if (f) {
return f.apply(this, arguments);
}
var argStrs = [];
for (var i = 0; i < arguments.length; ++i) {
argStrs.push("a[" + i + "]");
}
f = new Function("var a=arguments;return new this(" + argStrs.join() + ");");
if (arguments.length < 100) {
fs[arguments.length] = f;
}
return f.apply(this, arguments);
};
}) ();
ตัวอย่าง:
Foo.New.apply(null, [a, b, c])
;
แน่นอนว่าคุณสามารถสร้างฟังก์ชั่นที่Function.prototype.New
ใช้ด้วยตนเองแต่ไม่เพียง แต่จะให้ความหมายที่ชัดเจนและ clunky มัน (โดยนิยาม) จะต้องมีขอบเขต Function
อนุญาตให้โค้ดทำงานกับอาร์กิวเมนต์จำนวนเท่าใดก็ได้
eval
การใช้โค้ดขนาดใหญ่ในแบบที่แอพพลิเคชั่นอย่าง JSPacker ชอบ JSPacker + gzip มักจะส่งผลให้ไฟล์มีขนาดเล็กกว่าโซลูชันตัวใดตัวหนึ่ง แต่เมื่อคุณชี้ให้เห็นอย่างถูกต้องแล้วก็คือการคอมไพล์คอมไพเลอร์สองครั้งในโค้ดเดียวกันรวมทั้งโอเวอร์เฮดบางส่วน