Có một số điều không thể thực hiện trong JS nếu không có hàm giống như eval ( eval
,Function
và có thể nhiều hơn).
Lấy apply
ví dụ. Nó rất dễ sử dụng khi sử dụng nó trong các cuộc gọi chức năng thông thường:
foo.apply(null, [a, b, c])
Nhưng làm thế nào bạn sẽ làm điều này cho các đối tượng bạn đang tạo thông qua cú pháp mới?
new Foo.apply(null, [a, b, c])
không hoạt động, cũng không làm các hình thức tương tự.
Nhưng bạn có thể giải quyết giới hạn này thông qua eval
hoặc Function
(tôi sử dụng Function
trong ví dụ này):
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);
};
}) ();
Thí dụ:
Foo.New.apply(null, [a, b, c])
;
Tất nhiên, bạn có thể tự xây dựng các hàm Function.prototype.New
sử dụng, nhưng không chỉ dài dòng và cồng kềnh này, nó (theo định nghĩa) phải là hữu hạn. Function
cho phép mã làm việc cho bất kỳ số lượng đối số.
eval
các đoạn mã lớn theo cách mà các ứng dụng như JSPacker thích? JSPacker + gzip thường dẫn đến kích thước tệp nhỏ hơn so với giải pháp của riêng nó, nhưng như bạn chỉ ra một cách chính xác, về cơ bản, nó sẽ kích hoạt trình biên dịch hai lần trên cùng một đoạn mã, cộng với một số chi phí thay thế chuỗi.