2009-08-13 18 views
16

का उपयोग करके बनाए गए अज्ञात कार्यों को निष्पादित करना मेरे पास एक स्ट्रिंग के रूप में एक फ़ंक्शन और इसकी सामग्री है।जावास्क्रिप्ट eval()

var funcStr = "function() { alert('hello'); }"; 

अब, मैं वास्तव में उस चर को एक चर में प्राप्त करने के लिए eval() करता हूं।

var func = eval(funcStr); 

अगर मैं सही ढंग से याद, क्रोम और ओपेरा में, बस

func(); 

बुला कि समारोह लागू और चेतावनी प्रदर्शित किया गया था।

लेकिन, अन्य ब्राउज़रों में यह मामला नहीं था। कुछ नहीं हुआ।

मुझे कोई बहस नहीं चाहिए कि यह सही तरीका है, लेकिन मैं यह कैसे कर सकता हूं? मैं चर (कॉल) कॉल करने में सक्षम होना चाहता हूँ; उस चर में संग्रहीत समारोह निष्पादित करने के लिए।

+0

मुझे आश्चर्य है कि आपको एक स्ट्रिंग अक्षर के रूप में प्रतिनिधित्व किए गए अज्ञात फ़ंक्शन की आवश्यकता क्यों है, क्योंकि केवल नामित फ़ंक्शन होने के विपरीत? –

+0

एफवाईआई: मैं अपने वेब ऐप के लिए अपनी खुद की लिपि परिभाषित कर रहा हूं। मैं एक दुभाषिया लिख ​​रहा हूं और फ्लाई पर जेएस फ़ंक्शंस बनाने की आवश्यकता है और फिर उनमें से वास्तविक निष्पादन योग्य कार्य बनाते हैं। –

+0

आप पारंपरिक तरीके से दुभाषिया क्यों नहीं लिखेंगे? – Breton

उत्तर

30

कैसे इस बारे में?

var func = new Function('alert("hello");'); 

कार्य करने के लिए तर्क जोड़ने के लिए:

var func = new Function('what', 'alert("hello " + what);'); 
func('world'); // hello world 

ध्यान दें कि कार्यों वस्तुओं रहे हैं और किसी भी चर को सौंपा जा सकता के रूप में वे कर रहे हैं:

var func = function() { alert('hello'); }; 
var otherFunc = func; 
func = 'funky!'; 

function executeSomething(something) { 
    something(); 
} 
executeSomething(otherFunc); // Alerts 'hello' 
+0

काम किया यह करने के लिए यह एक शानदार तरीका है, और सभी ब्राउज़रों में काम करता है। धन्यवाद :) –

6

var funcStr = "var func = function() { alert('hello'); }"; 

eval(funcStr); 

func(); 
+0

अरे, धन्यवाद कि काम किया! लेकिन ऐसा करने के लिए यह थोड़ा अजीब लग रहा है: डी। –

4

प्रयास करें इस तरह eval का उपयोग करें:

var func = eval('(' + funcStr + ')'); 
+0

मैंने शुरुआत में यही सोचा था, लेकिन मुझे पूरा यकीन है कि केवल वस्तुओं पर लागू होता है। – karim79

+0

इसके अलावा, चाहे यह सही तरीका है या गलत तरीका ..., यह आईई में काम नहीं करता है। –

+0

कार्य भी ऑब्जेक्ट्स हैं। यह कोष्ठक के साथ काम करता है। – Blixt

13

आईई नहीं कर सकते eval कार्य (संभवतः सुरक्षा कारणों से)।

सबसे अच्छा समाधान का इस तरह, एक सरणी में समारोह डाल करने के लिए है:

var func = eval('[' + funcStr + ']')[0]; 
+1

हे ... स्नीकी स्नीकी! – Blixt

+0

हां यह कर सकता है। हालांकि, फ़ंक्शन शाब्दिक विवरण नहीं हैं, इसलिए उन्हें उनके चारों ओर कोष्ठक की आवश्यकता है, यह आपके सरणी समाधान –

+1

@ जुआन: गलत से साफ़ है; यह नहीं कर सकते। 'जावास्क्रिप्ट आज़माएं: चेतावनी (eval (' (फ़ंक्शन() {वापसी 3;}) ')); ' – SLaks

0

क्या भी काम करता है

var myFunc = function(myParam){ 
    // function body here 
} 
7

है मुझे पता है यह पुराना है, लेकिन यह केवल वैध परिणाम था अज्ञात जावास्क्रिप्ट फ़ंक्शन स्ट्रिंग का मूल्यांकन करने के लिए मेरी Google खोजों में आ रहा है।

मुझे अंततः यह पता चला कि jquery google समूह पर किसी पोस्ट से इसे कैसे किया जाए।

eval("false||"+data) 

"() {123 वापसी;} समारोह" जहां डाटा की तरह अपने समारोह स्ट्रिंग है

अब तक, मैं केवल यह IE8 और FF8 (मेरी निजी कंप्यूटर पर ब्राउज़र) में, की कोशिश की है लेकिन मेरा मानना ​​है कि jquery आंतरिक रूप से इसका उपयोग करता है, इसलिए इसे हर जगह लगभग काम करना चाहिए।

+0

मुझे समझ में नहीं आता कि हर किसी को ऐसा क्यों लगता है। यह सोना है, धन्यवाद! – Shwouchk

0

EVAL बिना eval() ...

function evalEx(code){ 
    var result,D=document,S=D.createElement('script'), 
    H=D.head||D.getElementsByTagName['head'][0], 
    param=Array.prototype.slice.call(arguments); 
    code='function evalWE(){'+code+'}'; 
    S.innerText===''?S.innerText=code:S.textContent=code; 
    H.appendChild(S); 
    result=evalWE.apply(this,param); 
    H.removeChild(S); 
    return result 
} 

प्रयोग उदाहरण:

ABC=evalEx('return "ABC"'); 
nine=evalEx('return arguments[1]+arguments[2]',4,5); 
+0

हाहा, आपने मुझे कारण दिया है कि क्यों Google Packaged Apps HTML में इनलाइन जावास्क्रिप्ट को अस्वीकार करते हैं: http://developer.chrome.com/extensions/contentSecurityPolicy.html – nraynaud

0

स्ट्रिंग के रूप में एक समारोह को परिभाषित करने eval() यह ing, और एक पैरामीटर में पारित करते हुए तुरंत समारोह लागू (और फिर परिणाम डंपिंग के एक साधारण उदाहरण कंसोल):

console.log('eval: %s', eval("(function(foo) { return foo.bar; })")({"bar": "12345"}));

यह निम्नलिखित की तरह उत्पादन पैदा करता है।

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; 
    }; 
} 

उपयोग के उदाहरण:

eval: 12345

3

हम सार्वभौमिक समारोह पार्सर कि असली जावास्क्रिप्ट कार्य करने के लिए स्ट्रिंग में कनवर्ट तैयारी कर इस समस्या का समाधान

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(); 

here jsfiddle है

-1

function-serialization-tools एक फ़ंक्शन, s2f() प्रदान करता है, जो फ़ंक्शन का स्ट्रिंग प्रस्तुति लेता है और इसे फ़ंक्शन के रूप में देता है।

संबंधित मुद्दे