উত্তর:
স্ট্রিং থেকে কোনও ফাংশন তৈরির জন্য আমি 4 টি বিভিন্ন উপায়ে একটি জেএসপিফার পরীক্ষা যুক্ত করেছি:
ফাংশন ক্লাসের সাথে 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হ্যাকারদের জন্য ফাঁকগুলি খুলতে পারে: বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স /… তবে আপনি যদি এর ঝুঁকিগুলি জানেন এবং সেগুলি এড়াতে পারেন তবে এটি করার একটি দুর্দান্ত সহজ উপায় স্ট্রিং থেকে একটি ফাংশন তৈরি করুন
হ্যাঁ, ব্যবহার 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
JavaScriptFunctionvar 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/
evalvar name = "foo";
// Implement it
eval("function " + name + "() { alert('Foo'); };");
// Test it
foo();
// Next is TRUE
foo.name === 'foo'
sjsClasshttps://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]))