জাভাস্ক্রিপ্ট সহ একটি স্ট্রিং থেকে কোনও ফাংশন তৈরির উপায় আছে?


107

উদাহরণ স্বরূপ;

var s = "function test(){
  alert(1);
}";

var fnc = aMethod(s);

যদি এটি স্ট্রিং হয় তবে আমি এমন একটি ফাংশন চাই যার নাম fnc called এবং fnc();পপস সতর্কতা পর্দা।

eval("alert(1);") আমার সমস্যা সমাধান করতে পারে না।

উত্তর:


73

স্ট্রিং থেকে কোনও ফাংশন তৈরির জন্য আমি 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; };");

http://jsben.ch/D2xTG

2 ফলাফল নমুনা: এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন


@ কেথপ্রোগ চিল ডাউন;)। এটি সর্বদা খারাপ নয়, এই পরিস্থিতির মতো, এই মুহুর্তে জাসস্পিফটি নিচে রয়েছে, ভাগ্যক্রমে আমি ফলাফলের স্ক্রিনশটগুলি ডাউন হওয়ার আগে যুক্ত করেছি, যখন আমি বাল্কের কাছ থেকে মন্তব্য পেয়েছি।
phnah

@ কেথপ্রোগ এফওয়াইআই এটি মডারেশন সিস্টেম দ্বারা উত্পাদিত একটি ক্যান প্রতিক্রিয়া ছিল :) এটি একটি কাতারে পপ আপ হয় এবং আমরা পূর্বনির্ধারিত সমস্যাগুলির জন্য যাচাই করি, যার একটি এই মন্তব্যটি সমাধানের জন্য ডিজাইন করা হয়েছে। এটি কোনও কঠোর এবং দ্রুত নিয়ম নয় এবং আপনি মন্তব্যটি কোনও আদেশের পরিবর্তে কোনও আদেশের আকারে লক্ষ্য করবেন।
ড্যান স্মিথ

174

স্ট্রিং থেকে একটি ফাংশন তৈরির আরও ভাল উপায় হ'ল Function:

var fn = Function("alert('hello there')");
fn();

এটির যেমন সুবিধা / অসুবিধা রয়েছে যা বর্তমান স্কোপে ভেরিয়েবলগুলি (বৈশ্বিক না হলে) নতুন নির্মিত ফাংশনে প্রযোজ্য না।

যুক্তিগুলি পাস করাও সম্ভব:

var addition = Function("a", "b", "return a + b;");
alert(addition(5, 3)); // shows '8'

5
সম্মত হন, আপনার সাথে Functionস্থানীয় ক্ষেত্রটিকে দূষিত করবেন না এবং এজন্য evalইঞ্জিনগুলির জন্য অপ্টিমাইজেশন এতটা শক্ত করে তোলে ... ওপি উদাহরণ সহ আমি এই করব:var fnc = Function('return '+s)();
সিএমএস

আমি মনে করি এটি সম্ভবত গ্রহণযোগ্য উত্তর হওয়া উচিত। এটি eval () এর চেয়ে অনেক বেশি নিরাপদ।
ব্রায়ান রায়নার

আপনি, আমার বন্ধু, অনেক উন্নয়নের দাবিদার। এতে কোনও ফাংশন অবজেক্ট তৈরির সুবিধা রয়েছে যা ইভেন্টগুলিতে নির্ধারিত হতে পারে ইত্যাদি example উদাহরণস্বরূপ: এলিমেন্ট.অনলিক্লিক = ফাংশন ("সতর্কতা ('পরীক্ষা');"));
রায়ান গ্রিগস 3

1
@ রায়ানগ্রিগস আপনার ক্ষেত্রে আপনার "ইওলাল" কার্যকারিতাটির দরকার নেই তাই এটি আরও ভাল হিসাবে লেখা হয় element.onclick = function() { alert("test"); }
লেকেনস্টেইন

1
আপনি আমার উদাহরণ থেকে সঠিক। তবে, আপনি যদি স্ট্রিংগুলিতে স্বেচ্ছাসেবী ফাংশন নির্ধারণ করতে চান তবে আপনার পদ্ধতিটি সঠিক। আমি আসলে এটি করার চেষ্টা করছি। আমার কাছে স্ট্রিং ভেরিয়েবলগুলিতে একাধিক ফাংশন সঞ্চিত আছে এবং একটি অনক্লিক অ্যাকশনে একটি বরাদ্দ করতে চাই।
রায়ান গ্রিগস 15

38

আপনি খুব কাছের।

//Create string representation of function
var s = "function test(){  alert(1); }";

//"Register" the function
eval(s);

//Call the function
test();

এখানে একটি কার্যকরী মাপসই


আমি জানতাম যে ফাংশনটি ঘোষিত হয়েছিল, তবে ফাংশনটির নামটি কল করতে পারে না। অনেক ধন্যবাদ.
ymutlu

4
evalভবিষ্যতের সন্ধানকারীদের কাছে বাধ্যতামূলক সতর্কতা: evalহ্যাকারদের জন্য ফাঁকগুলি খুলতে পারে: বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স /… তবে আপনি যদি এর ঝুঁকিগুলি জানেন এবং সেগুলি এড়াতে পারেন তবে এটি করার একটি দুর্দান্ত সহজ উপায় স্ট্রিং থেকে একটি ফাংশন তৈরি করুন

এটি যদি ডাটাবেস রেকর্ড থেকে ফাংশনটির নাম না থেকে থাকে তবে?
মার্সেল Djaman

13

হ্যাঁ, ব্যবহার 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


হাই এই পদ্ধতিতে তীর ফাংশন সমর্থন সমর্থন করুন?
সতীশ কুমার

1
আমি টাইপসর্পিতে এই ত্রুটিটি পেয়েছি "সম্পত্তি 'parseFunction' 'স্ট্রিং' টাইপটিতে বিদ্যমান নেই।"
সেগোন

11

এতে গতিশীল ফাংশনের নাম 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'

6

এই কৌশলটি চূড়ান্তভাবে 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>

3

new Function()ভিতরে ফিরে আসার সাথে ব্যবহার করুন এবং তাৎক্ষণিকভাবে এটি সম্পাদন করুন।

var s = `function test(){
  alert(1);
}`;

var new_fn = new Function("return " + s)()
console.log(new_fn)
new_fn()


1

গতিশীল যুক্তি সহ একটি উদাহরণ:

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]))

ধন্যবাদ। অত্যন্ত আকর্ষণীয়
Васильев
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.