वहाँ कुछ चीजें एक 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
उपयोग किए जाने वाले फ़ंक्शन का निर्माण कर सकते हैं , लेकिन न केवल यह क्रिया और क्लंकी है, इसे (परिभाषा के अनुसार) परिमित होना होगा। Function
कोड को किसी भी तर्क के लिए काम करने की अनुमति देता है।
eval
जिस तरह से JSPacker जैसे अनुप्रयोगों के लिए कोड की बड़ी मात्रा पर आपके विचार क्या हैं ? JSPacker + gzip आमतौर पर अपने आप ही समाधान की तुलना में छोटे फ़ाइल आकारों में परिणाम करता है, लेकिन जैसा कि आप ठीक से इंगित करते हैं कि यह अनिवार्य रूप से कोड के एक ही टुकड़े पर दो बार एक संकलक को फायरिंग कर रहा है, साथ ही स्ट्रिंग प्रतिस्थापन करने के लिए कुछ ओवरहेड।