2010-07-26 16 views
6
var foo = "function(){ alert('meee'); }"; 
foo(); 

मैंने उपर्युक्त कोशिश की है लेकिन यह काम नहीं करता है क्या उस काम को निष्पादित किए बिना निष्पादित करने का कोई अन्य तरीका है?जावास्क्रिप्ट में एक फ़ंक्शन में स्ट्रिंग बदलना (eval नहीं)

thnx

+0

यदि आप अपनी समस्या के अनुसार अधिक विशिष्ट हो सकते हैं तो शायद इस दृष्टिकोण का एक विकल्प है जहां आपको eval का उपयोग करने की आवश्यकता नहीं है। – rfunduk

+0

अच्छी तरह से 'फ़ंक्शन() {अलर्ट (' मी ');}' एक ऐसा पाठ है जो अब कैप्चर करने में कामयाब रहा है, मुझे फ़ंक्शन को कॉल करने की आवश्यकता है ... मुझे लगता है कि ऊपर दिया गया उदाहरण php पर काम करता है, शायद मुझे यह विचार कैसे मिला ... तो फ़ंक्शन को '

function(){alert('meee')}
' आंतरिक एचटीएमएल से लिया गया था, इसलिए मुझे लगता है कि यह एक पाठ – Val

उत्तर

8

आप सीधे Function निर्माता के रूप में उपयोग करना चाहते हैं एंडर्स ने कहा। सभी तर्क तार हैं। आखिरी तर्क समारोह का मुख्य भाग है, किसी भी प्रमुख तर्क समारोह के तर्कों के नाम हैं।

ऐन्डर्स 'उदाहरण से उधार लिए,

var multiply = new Function("x", "y", "return x * y"); 

var multiply = function (x,y) { 
    return x * y 
} 

लेखन आपके मामले में की तरह हो सकता है, आप "function(){ alert('meee'); }" है और आप वर foo करने के लिए एक समारोह के रूप में यह सहेजना चाहते हैं।

var fn = "function(){ alert('meee'); }"; 
var foo = new Function("return ("+fn+")")(); 
foo(); 
// alerts "meee" 

Function और eval के बीच का अंतर निजी दायरे में eval रन है, जबकि Function वैश्विक क्षेत्र में चलाता है।

var x="haha", y="hehe"; 

function test() { 
    var x=15, y=34; 
    eval("alert('eval: ' + x + ', ' + y)"); 
    new Function("alert('Func: ' + x + ', ' + y)")(); 
} 

test(); 

// eval: 15, 34 
// Func: haha, hehe 

कंसोल में इसे चलाने के लिए कोशिश मत करो, आप एक धोखा परिणाम (शान्ति eval का उपयोग करें) मिल जाएगा। इसे <script> टैग में लिखकर और ब्राउज़र में लोड करना वास्तविक परिणाम देगा।

+0

कृपया यह नहीं कि 'फ़ंक्शन' कन्स्ट्रक्टर इस फ़ंक्शन को बनाता है, वही है जिस तरह से 'eval' करता है। यह वास्तव में 'eval' का एक और रूप है, इसलिए यह सब वास्तव में' eval' शब्द का उपयोग करने से बचता है। लेकिन आप इसे 'खिड़की [(टाइपोफ [] [0]) [3] + "वैल"] ("4 + 3")' की तरह भी कर सकते हैं, जो '7' देता है। – Claudiu

+0

मुझे दोहराना है। आप कहते हैं कि यदि आप 'eval' का उपयोग करते हैं तो आप स्क्रिप्ट इंजेक्शन से डरते हैं या आपके पासवर्ड चुरा रहे हैं। अच्छा, ** यह EVAL का उपयोग कर रहा है ** !!! यह वही बात है - मनमाने ढंग से कोड जेएस द्वारा संकलित किया जा रहा है और चलाया जा रहा है। आप क्यों चाहते हैं कि उपयोगकर्ता आपके कोड पर अपने कार्यों की आपूर्ति कर सकें? – Claudiu

0

मैं के बारे में पता नहीं है कि ... वहाँ शायद आप अपने आप को एक स्क्रिप्ट इंजेक्शन हमले कि एक के रूप में जावास्क्रिप्ट आसपास गुजर शामिल नहीं करता है की चपेट में किए बिना ऐसा करने के लिए कोशिश कर रहे हैं कि क्या करना है एक बेहतर तरीका है स्ट्रिंग।

+0

होगा मुझे पता है :) मुझे इसके बारे में बहुत कुछ पता है लेकिन मुझे एक सुरक्षित की जरूरत है क्योंकि मैंने eval well के बारे में पढ़ा है मुझे यह धारणा मिली है कि आप लोगों के लिए उपयोगकर्ता नाम और पासवर्ड भी दे सकते हैं या स्वयं को सब कुछ हटा सकते हैं :) – Val

+0

यह वास्तव में इस पर निर्भर करता है कि आपका जावास्क्रिप्ट कहां से आ रहा है? यदि यह डेटाबेस में है और कोड स्ट्रिंग्स में एकमात्र तरीका एक सुरक्षित रूप है या आप क्या हैं, तो आप शायद ठीक हैं। दूसरी तरफ, यदि आप किसी को भी अपने बैकएंड के खिलाफ मनमाने ढंग से कोड निष्पादित करने दे रहे हैं, तो आप शायद परेशानी के लिए पूछ रहे हैं। अधिकांश जावास्क्रिप्ट हमले जिनकी मैं कल्पना कर सकता हूं वे ज्यादातर आपके डेटाबेस की बजाय उपयोगकर्ता इंटरैक्शन को प्रभावित करने जा रहे हैं। आप जो भी कह रहे हैं वह शायद एक स्क्रिप्ट है जो कीस्ट्रोक लॉग करता है और उन्हें एक्सएचआर पोस्ट या इसी तरह के माध्यम से दूरस्थ साइट पर भेजता है। एक HTML तत्व आंतरिक एचटीएमएल से – vicatcu

+0

.. – Val

3

MDC के अनुसार। का उपयोग करें:

var multiply = new Function("x", "y", "return x * y"); 
var theAnswer = multiply(7, 6); 
+0

मुझे यकीन है कि मैंने गणित के पाठ के लिए नहीं पूछा था। मैं चाहता हूं कि एक स्ट्रिंग बनाना जिसमें फ़ंक्शन के रूप में फ़ंक्शन शामिल है और उसे कॉल करें। यह eval, सुरक्षित और बहुत धीमी नहीं उपयोग कर आसान है। – Val

+1

@ वैल, यह एक उदाहरण है कि आपको क्या उपयोग करना चाहिए, संदर्भ पृष्ठ पढ़ें। – Anders

+0

मेरा सुझाव है कि आपको इसे फिर से पढ़ना चाहिए जहां यह गुण कहता है ...'तर्क अस्वीकृत' और 'arity deprecated' – Val

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