2009-09-30 17 views
5

मेरे पास यह जेसन है, और जब मुझे यह जेसन मिलता है तो मुझे कॉलबैक ऑब्जेक्ट पर आने वाले फ़ंक्शन को चलाने की आवश्यकता होती है।किसी ऑब्जेक्ट फ़ॉर्म में eval में पैरामीटर कैसे पास करें?

{ 
    formId: 'snn_service_item_form', 
    item_id: '1', 
    item_title: 'some item', 
    item_description: '', 
    item_duration: '10', 
    item_price: '120', 
    item_level_1 : 1, 
    item_level_2 : 0, 
    item_level_3 : 1, 
    item_type: 'p', 
    callback : { 
     callbackName : 'getServices', 
     callbackParams : { 
      _param1 : 1, 
      _param2 : 2 
    } 
} 
} 

तो यह के अनुसार मैं इस चलाने की आवश्यकता:

getServices(1,2); 

मैं कर सकता हूँ कि eval समारोह की तरह साथ:

eval(json.callback.callbackName+'(\''+ json.callback.callbackNParams._param1 +'\',\''+ json.callback.callbackNParams._param2 +'\')'); 

मैं के लिए एक में डाल कर इस स्वचालित कर सकते हैं एक स्ट्रिंग में पैरामीटर में और लिखना, लेकिन मुझे नहीं लगता कि यह जाने का सबसे अच्छा तरीका है।

वहाँ एक वर से समारोह नाम प्रदान करते हैं एक तरीका है और इस तरह, एक वस्तु के रूप में अपनी मापदंडों दे रही है मेरे मामले में:

json.callback.callbackName(json.callback.callbackParams); 

मुझे पता है इस तरह से यह करने के लिए नहीं है, लेकिन यह क्या है मैं सीखना चाहते है।

धन्यवाद, सीनान।

+0

उत्तर के लिए धन्यवाद, मैं कॉल पर काम करूंगा और इसे चलाने के लिए आवेदन करूंगा। – Sinan

उत्तर

10

इस पर निर्भर करता है कि कॉल कहां कॉल किया गया है (वैश्विक दायरा या स्थानीय दायरा)।

वैश्विक हैं, तो आप eval की जरूरत नहीं है (और यह से बचने के लिए सुरक्षित है), तो आप सिर्फ वैश्विक window वस्तु के माध्यम से समारोह संदर्भ:

var args = []; 
for(var p in json.callback.callbackParams) { 
    args.push(json.callback.callbackParams[p]); 
} 
window[json.callback.callbackName].apply(null, args) 

देखें apply() function ऊपर का इस्तेमाल किया।

यदि यह स्थानीय दायरे में है, तो आपको eval (यह कैसे ठीक है) की आवश्यकता है।

+0

स्थानीय दायरे के लिए, आप फ़ंक्शन ऑब्जेक्ट प्राप्त करने के लिए 'eval' का उपयोग कर सकते हैं, और फिर भी इसे कॉल करने के लिए अधिक विश्वसनीय' लागू 'का उपयोग करें। बीटीडब्लू यह गारंटी नहीं देता है कि 'इन (इन)' आपके इच्छित क्रम में पैरा वापस कर देगा। – bobince

1

eval का उपयोग न करें। आप window वस्तु से एक नामित वैश्विक चर या समारोह के लिए एक संदर्भ प्राप्त कर सकते हैं:

var callbackfunction= window[json.callback.callbackName]; 

और एक स्ट्रिंग के लिए अपने मूल्यों serialise करने के लिए सिर्फ उन्हें unreliably जावास्क्रिप्ट को वापस पार्स करने के लिए कोशिश कर रहा मूर्खतापूर्ण है। समारोह को स्पष्ट रूप से कॉल करें:

callbackfunction.call(window, json.callback.callbackParams.param1, json.callback.callbackParams.param2); 

(। window यहाँ जब आप वस्तु तरीकों का उपयोग कर नहीं कर रहे हैं के लिए this के लिए एक डमी मान है)

यह स्वचालित स्वीकार करने के लिए मापदंडों के किसी भी संख्या चालू करने के लिए किया जाएगा के लिए बेहतर

callbackParams: [1, 2] 

और फिर apply का उपयोग समारोह कॉल करने के लिए:

एक सादे सरणी में callbackParams
+2

'func.call (शून्य, ...) 'आपको' func.call (विंडो, ...) 'के रूप में वही (अच्छी तरह से, लगभग) व्यवहार देगा -' इस 'मूल्य के साथ कार्यवाही का कार्य वैश्विक वस्तु है। यह छोटा है, हालांकि शुरुआती लोगों के लिए शायद कम वर्णनात्मक है। – kangax

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