जवाबों:
मैंने स्ट्रिंग से फ़ंक्शन बनाने के लिए 4 अलग-अलग तरीकों से एक jsperf टेस्ट जोड़ा:
फ़ंक्शन क्लास के साथ RegExp का उपयोग करना
var func = "function (a, b) { return a + b; }".parseFunction();
"वापसी" के साथ फंक्शन क्लास का उपयोग करना
var func = new Function("return " + "function (a, b) { return a + b; }")();
आधिकारिक फ़ंक्शन निर्माता का उपयोग करना
var func = new Function("a", "b", "return a + b;");
एवल का उपयोग करना
eval("var func = function (a, b) { return a + b; };");
स्ट्रिंग से फ़ंक्शन बनाने का एक बेहतर तरीका है Function
:
var fn = Function("alert('hello there')");
fn();
इसका लाभ / नुकसान है कि मौजूदा दायरे में चर (यदि वैश्विक नहीं है) नवनिर्मित फ़ंक्शन पर लागू नहीं होता है।
तर्क पास करना भी संभव है:
var addition = Function("a", "b", "return a + b;");
alert(addition(5, 3)); // shows '8'
Function
आप स्थानीय गुंजाइश को प्रदूषित नहीं करते हैं और यही वजह है कि eval
इंजनों के लिए अनुकूलन इतना कठिन है ... ओपी उदाहरण के साथ, मैं चाहता हूं:var fnc = Function('return '+s)();
element.onclick = function() { alert("test"); }
।
तुम बहुत करीब हो।
//Create string representation of function
var s = "function test(){ alert(1); }";
//"Register" the function
eval(s);
//Call the function
test();
यहां वर्किंग फिडल है ।
eval
भविष्य के खोजकर्ताओं के लिए अनिवार्य चेतावनी: eval
हैकर्स के लिए खामियां खोल सकते हैं: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… लेकिन अगर आप इसके खतरों को जानते हैं और इनसे बच सकते हैं, तो यह एक अच्छा सरल तरीका है एक स्ट्रिंग से एक फंक्शन बनाएं
हां, उपयोग Function
करना एक महान समाधान है लेकिन हम थोड़ा आगे बढ़ सकते हैं और सार्वभौमिक पार्सर तैयार कर सकते हैं जो स्ट्रिंग को पार्स कर सकते हैं और इसे वास्तविक जावास्क्रिप्ट फ़ंक्शन में बदल सकते हैं ...
if (typeof String.prototype.parseFunction != 'function') {
String.prototype.parseFunction = function () {
var funcReg = /function *\(([^()]*)\)[ \n\t]*{(.*)}/gmi;
var match = funcReg.exec(this.replace(/\n/g, ' '));
if(match) {
return new Function(match[1].split(','), match[2]);
}
return null;
};
}
उपयोग के उदाहरण:
var func = 'function (a, b) { return a + b; }'.parseFunction();
alert(func(3,4));
func = 'function (a, b) { alert("Hello from function initiated from string!"); }'.parseFunction();
func();
यहाँ jsfiddle है
JavaScript
Function
var name = "foo";
// Implement it
var func = new Function("return function " + name + "(){ alert('hi there!'); };")();
// Test it
func();
// Next is TRUE
func.name === 'foo'
स्रोत: http://marcosc.com/2012/03/dynamic-function-names-in-javascript/
eval
var name = "foo";
// Implement it
eval("function " + name + "() { alert('Foo'); };");
// Test it
foo();
// Next is TRUE
foo.name === 'foo'
sjsClass
https://github.com/reduardo7/sjsClass
Class.extend('newClassName', {
__constructor: function() {
// ...
}
});
var x = new newClassName();
// Next is TRUE
newClassName.name === 'newClassName'
यह तकनीक अंततः eval विधि के बराबर हो सकती है, लेकिन मैं इसे जोड़ना चाहता था, क्योंकि यह कुछ के लिए उपयोगी हो सकता है।
var newCode = document.createElement("script");
newCode.text = "function newFun( a, b ) { return a + b; }";
document.body.appendChild( newCode );
यह कार्यात्मक रूप से आपके दस्तावेज़ के अंत में इस <स्क्रिप्ट> तत्व को जोड़ने की तरह है, जैसे:
...
<script type="text/javascript">
function newFun( a, b ) { return a + b; }
</script>
</body>
</html>
new Function()
अंदर वापसी के साथ प्रयोग करें और इसे तुरंत निष्पादित करें।
var s = `function test(){
alert(1);
}`;
var new_fn = new Function("return " + s)()
console.log(new_fn)
new_fn()
गतिशील तर्कों के साथ एक उदाहरण:
let args = {a:1, b:2}
, fnString = 'return a + b;';
let fn = Function.apply(Function, Object.keys(args).concat(fnString));
let result = fn.apply(fn, Object.keys(args).map(key=>args[key]))