2012-06-19 17 views
53

मैं जावास्क्रिप्ट की दुनिया में नया हूं और बहुत ही बुनियादी कार्यों को लिखने के साथ झुका रहा हूं और दुर्घटना से नीचे दिए गए उदाहरण पर ठोकर खा रहा हूं और यह सुनिश्चित नहीं है कि जब मैं फ़ंक्शन की मांग करता हूं तो पैरामीटर नहीं गुजरता है तो यह क्यों काम करता है।यदि मैं जावास्क्रिप्ट फ़ंक्शन में पैरामीटर पास नहीं करता तो क्या होता है?

नमूना समारोह

function myfunction(x) { 
    alert("This is a sample alert"); 
} 

अब अगर मैं समारोह myfunction(); मैं चेतावनी के साथ प्रस्तुत कर रहा हूँ कहते हैं। ऐसा क्यों है कि जब मैं पैरामीटर पारित नहीं करता हूं तो मैं बिना किसी त्रुटि या चेतावनियों के फ़ंक्शन को कॉल करने में सक्षम हूं?

संपादित

मैं इतने सारे महान जवाब उम्मीद नहीं थी और मैं एक स्थिति में किसी भी तरह से अभी तक कहने के लिए जो जवाब सबसे अच्छा है कर रहा हूँ तो मैं सर्वश्रेष्ठ उत्तर का सुझाव देने के लोगों का अनुरोध करने में सक्षम हूँ और मैं उस व्यक्ति को स्वीकृति दूंगा।

+2

भी सहायक हो सकता है: https://developer.mozilla.org/en/JavaScript/Guide/Functions –

+1

जेएस में फ़ंक्शन हस्ताक्षर के आधार पर कोई ओवरलोडिंग नहीं है, इसलिए यह वास्तव में परवाह नहीं करता कि फ़ंक्शन कितने पैराम "अपेक्षा करता है "। आप पैराम में भी पास कर सकते हैं कि फ़ंक्शन को लेने के लिए परिभाषित नहीं किया गया है और उन्हें पुनर्प्राप्त करने के लिए केवल कीवर्ड तर्कों का उपयोग करें। – scrappedcola

+0

@scrappedcola - ओवरलोडिंग के साथ-साथ पैरामीटर में पास करने का क्या मतलब है जिसे फ़ंक्शन को परिभाषित नहीं किया गया है? क्या आप उदाहरण दे सकते हैं? – PeanutsMonkey

उत्तर

57

कुछ भी नहीं होगा- जिसका अर्थ है कि आपको जावास्क्रिप्ट में पैरामीटर को पारित करने के रूप में कोई त्रुटि या चेतावनी नहीं मिलेगी वैकल्पिक है।
सभी पैरामीटर जिन्हें "आपूर्ति" नहीं किया गया था, उनके पास undefined value होगा।

function foo(x, y, z){ 
    x === 1 
    y === undefined 
    z === undefined 
} 

तुम भी, और अधिक तर्क पारित कर सकते हैं जैसे:

foo(1,2,3,4,5,7); // Valid! 

आप समारोह अंदर से arguments.length द्वारा आपूर्ति मानकों की मात्रा पता कर सकते हैं

function foo(x, y, z){ 
    //... 
} 

foo(1); 
अब foo समारोह अंदर

Live DEMO


डेमो से कोड:

function foo(x, y, z) { 
    console.log('x value: ' + x); 
    console.log('y value: ' + y); 
    console.log('z value: ' + z); 
    console.log('Arguments length: ' + arguments.length); 
} 

console.log('Zero parameters'); 
foo(); 
console.log('Four parameters'); 
foo(1, 2, 3, 4);​ 

उपयोगी समारोह का उदाहरण है कि मानकों की किसी भी राशि को संभालने:

function max() { 
    var maxValue = arguments[0]; 
    for (var i = 1; i < arguments.length; i++) { 
     if (maxValue < arguments[i]) { 
      maxValue = arguments[i]; 
     } 
    } 
    return maxValue; 
} 

Live DEMO

+0

लाइव डेमो के लिए धन्यवाद। इतने अच्छे उत्तरों की उम्मीद नहीं थी। तो अगर मेरे पास फ़ंक्शन मायफंक्शन (ए, बी) {} 'जैसे फ़ंक्शन हैं और मानों का निष्पादन (1,2,3,4,5) पारित किया है, तो मुझे लगता है कि यह अभी भी मान्य है? क्या उम्मीद है कि कुछ चेतावनी या त्रुटि होगी? – PeanutsMonkey

+0

क्षमा करें, क्या आप 'console.log' कमांड के साथ-साथ तर्कों के बारे में विस्तार से बताएंगे। लम्बाई? – PeanutsMonkey

+0

@PeanutsMonkey। मान्य! कोई चेतावनी नहीं त्रुटि, यह भी उपयोगी हो, मैं आपको एक पल में एक डेमो दूंगा। – gdoron

5

यह जावास्क्रिप्ट काम करता है। पैरामीटर्स वैकल्पिक हैं, और फ़ंक्शन में अनुपलब्ध-मूल्य-मान मूल्य "अपरिभाषित" होगा यदि वे फ़ंक्शन कॉल से अनुपलब्ध हैं।

"वैकल्पिक" द्वारा मेरा मतलब यह है कि: का उपयोग करना फ़ंक्शन में पैरामीटर की मनमाने ढंग से लंबी सूची शामिल है। पैरामीटर की संख्या पारित करने के लिए पैरामीटर की संख्या और घोषित करने के बीच कोई संबंध नहीं होना चाहिए। सबसे अच्छा तरीका है इस घोषणा के बारे में सोचना है, तो:

function x(a, b, c) { 
    // ... 
} 

है कि आप एक समारोह की घोषणा कर रहे हैं और नाम "एक" पहले पैरामीटर के लिए, दूसरे के लिए "बी", और करने के लिए "सी" बाध्यकारी है तीसरा। हालांकि, यह गारंटी नहीं है कि उनमें से कोई भी वास्तव में फ़ंक्शन के किसी भी दिए गए आमंत्रण में किसी मान के लिए बाध्य होगा।

इसी तरह, आप सब पर किसी भी पैरामीटर के बिना एक समारोह को परिभाषित कर सकते हैं और फिर उन्हें arguments वस्तु के माध्यम से "पा":

function noArgs() { 
    var a = arguments[0], b = arguments[1], c = arguments[2]; 
    // ... 
} 

ताकि काफी पहले समारोह के रूप में एक ही नहीं है , लेकिन यह ज्यादातर तरीकों से करीब है जो व्यावहारिक रूप से गिनती है।

जावास्क्रिप्ट में "अपरिभाषित" मान एक मान है, लेकिन यह अर्थशास्त्र बहुत ही असामान्य हैं क्योंकि भाषाएं जाती हैं। विशेष रूप से यह बिल्कुल null मान जैसा नहीं है। इसके अलावा, "अपरिभाषित" स्वयं एक कीवर्ड नहीं है; यह सिर्फ एक अर्द्ध विशेष चर नाम है!

+0

क्या आप 'वैकल्पिक' के साथ-साथ "वास्तव में कोई मान नहीं" मूल्य 'अपरिभाषित' से आगे का विस्तार कर सकते हैं? – PeanutsMonkey

+0

@PeanutsMonkey - यदि चर नहीं दिया गया है, तो यह 'अपरिभाषित' होगा। –

+0

@ पॉइंटी - इसका मतलब क्या है कि कोई गारंटी नहीं है कि घोषित पैरामीटर में से कोई वास्तव में मूल्य के लिए बाध्य होगा? – PeanutsMonkey

7

जावास्क्रिप्ट कार्यों में सभी तर्क वैकल्पिक हैं ("loosely टाइप किया गया" पढ़ें)।

जावास्क्रिप्ट कार्यों तर्क के किसी भी संख्या, समारोह परिभाषा में नाम तर्क की संख्या की परवाह किए बिना के साथ लागू किया जा सकता है। चूंकि एक फ़ंक्शन को कम से कम टाइप किया गया है, इसलिए के लिए यह तर्क नहीं है कि वह किस प्रकार के तर्कों की अपेक्षा करता है, और किसी भी प्रकार के किसी भी प्रकार के पास के मानों को पास करना कानूनी है। जब घोषित घोषित किए गए कम तर्कों के साथ एक फ़ंक्शन का आह्वान किया जाता है, तो अतिरिक्त तर्कों में अनिर्धारित मान होता है।

आप नामांकित तर्क चर या तर्क वस्तु का उपयोग करके फ़ंक्शन के भीतर फ़ंक्शन के तर्कों का संदर्भ ले सकते हैं। इस वस्तु प्रत्येक तर्क समारोह के लिए पारित के लिए एक प्रवेश होता है, पहली प्रविष्टि के सूचकांक, 0. उदाहरण के लिए पर शुरू एक समारोह तीन तर्कों पारित हो जाता है, तो आप तर्क करने के लिए इस प्रकार का उल्लेख कर सकते हैं:

arguments[0] 
arguments[1] 
arguments[2] 
  • जावास्क्रिप्ट - परिभाषा गाइड, 5 वां संस्करण
1

क्योंकि कोई त्रुटि नहीं है जब तक कि फ़ंक्शन उस पैरामीटर के साथ काम करने में सक्षम न हो, जिसे आप पास करना चाहते हैं।

उदाहरण के लिए:

function myfunction(x) { 
    return x*2; 
} 

एक त्रुटि फेंक सकते हैं; यद्यपि शायद केवल NaN (इस मामले में) या variable is undefined

+0

ठीक है, जब तक कि मैं फ़ंक्शन में पैरामीटर का संदर्भ नहीं देता, मुझे कोई त्रुटि नहीं मिलेगी? क्या वह सही है? – PeanutsMonkey

+0

ऐसा लगता है कि यह काम करने लगता है, हाँ। –

+0

अब यदि मैं उदाहरण पर विस्तृत करता हूं तो आप प्रदान करते हैं i.e. 'कार्य Myfunction (ए, बी) {var calc = a + b; वापसी;} 'और फिर फ़ंक्शन' document.write (myfunction (1.2)) पर कॉल करें; 'मुझे पैरामीटर गुजरने के बावजूद मुझे अभी भी' अपरिभाषित 'का मान क्यों मिलता है? – PeanutsMonkey

2

जावास्क्रिप्ट में अन्य भाषाओं की तरह फ़ंक्शन पैरामीटर के लिए डिफ़ॉल्ट मान नहीं हैं। इसलिए, आप जितना चाहें उतने या छोटे तर्कों को पारित कर सकते हैं।

यदि आप कोई मान नहीं देते हैं, तो पैरामीटर undefined है।

function myfunction(x) { 
    alert(x); 
} 

myfunction(); // alerts undefined 
myfunction(1); // alerts 1 
myfunction(1,2,3); // alerts 1 

आप अधिक मापदंडों से हस्ताक्षर कर रहे हैं पारित, तो आप arguments उपयोग कर सकते हैं।

function myfunction(x) { 
    alert(x); 
    console.log(arguments); 
} 

myfunction(1,2,3); // alerts 1, logs [1,2,3] 
+0

धन्यवाद। क्रॉस पोस्टिंग के बजाय, क्या आप डेविड थॉमस को प्रदान किए गए मेरे उदाहरण को देख सकते हैं क्योंकि मुझे अभी भी त्रुटि 'अपरिभाषित' – PeanutsMonkey

+0

@PeanutsMonkey: हुह? तुम्हारी समस्या क्या है? –

+0

प्रति समस्या नहीं है। मैं आपके उत्तर में शामिल किए गए अधिक पैरामीटर को पारित करने के बारे में डेविड को अपने अनुवर्ती प्रश्न का जिक्र कर रहा था। मैं जो कुछ भी नहीं मानता हूं वह है 'लॉग' से आपका क्या मतलब है? यह कहां लॉग करता है? – PeanutsMonkey

1

आप, साथ ही समारोह

myFunction(1,2,3,4,5,6,7,'etc'); 

आप arguments संपत्ति जो प्रदान किए गए तर्कों को देखने के लिए एक सरणी है का उपयोग कर सकते में उल्लेख किया है एक से अधिक तर्क दे सकता है।

+1

+1। –

+0

@ अल्बर्ट तर्क ऑब्जेक्ट की तरह इसकी सरणी नहीं है [देखें] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments) – Mahi

0

यदि आप तर्क छोड़ देते हैं, तो इसका मान undefined होगा। यह आपको वैकल्पिक पैरामीटर को आसानी से बनाने में सक्षम बनाता है।

एक और विशेषता किसी पैरामीटर के साथ फ़ंक्शन को परिभाषित करने की क्षमता है, और इसे arguments ऑब्जेक्ट का उपयोग करके सफलतापूर्वक तर्कों के साथ कॉल करें। यह आपको आसानी से चर-लंबाई तर्क arrays बनाने देता है।