Bir eval benzeri fonksiyonu olmadan JS yapmak imkansız bazı şeyler vardır ( eval, Functionve belki daha fazla).
applyÖrneğin ele alalım. Sıradan işlev çağrılarında kullanırken kullanımı kolaydır:
foo.apply(null, [a, b, c])
Ancak, yeni sözdizimi ile oluşturduğunuz nesneler için bunu nasıl yaparsınız?
new Foo.apply(null, [a, b, c]) ne işe yaramaz ne de benzer biçimler.
Ancak bu kısıtlama üzerinde evalveya aracılığıyla çalışabilirsiniz Function( FunctionBu örnekte kullanıyorum):
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);
};
}) ();
Misal:
Foo.New.apply(null, [a, b, c]);
Tabii ki, elle kullanılan işlevleri manuel olarak oluşturabilirsiniz Function.prototype.New, ancak sadece bu ayrıntılı ve hantal değil, (tanım gereği) sonlu olmak zorundadır. Functionkodun herhangi bir sayıda argüman için çalışmasına izin verir.
evalBüyük kod parçalarını JSPacker gibi uygulamaların nasıl istediği hakkında düşünceleriniz nelerdir ? JSPacker + gzip genellikle her iki çözümden de daha küçük dosya boyutlarına neden olur, ancak haklı olarak işaret ettiğinizde, bir derleyiciyi aynı kod parçasına iki kez ateşler, ayrıca dize değiştirmeleri yapmak için bazı ek yükler çıkarır.