यदि मैं एक जावास्क्रिप्ट फ़ंक्शन में पैरामीटर पारित नहीं करता तो क्या होता है?


88

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

नमूना समारोह

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

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

संपादित करें

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


2
यह भी सहायक हो सकता है: developer.mozilla.org/en/JavaScript/Guide/Functions
फेलिक्स क्लिंग

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

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

2
@PeanutsMonkey। उसका मतलब था, आपके पास दो कार्य नहीं हो सकते हैं: function foo(x){...}और function foo(x,y,z){...}आपके पास प्रत्येक नाम के लिए केवल एक फ़ंक्शन हो सकता है।
gdoron

2
@PeanutsMonkey। हाँ, आप function overloadingjs में नहीं हो सकते हैं , आपके पास इसे मॉक करने के लिए अन्य तरीके हैं।
गॉर्डन मोनिका को सपोर्ट कर रहा है

जवाबों:


111

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

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

foo(1);

fooअब समारोह के अंदर :

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

alert(max(1, 5, 7, 2, 88, 32, 44));


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

क्षमा करें, क्या आप इस बात पर विस्तार से ध्यान देंगे कि आदेश क्या console.logकरता है साथ ही तर्कों का भी।
मूँगफली के दाने

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

1
@PeanutsMonkey। यह IE के साथ काम करता है यदि आपके पास डेवलपर्स कंसोल स्थापित है, तो मुझे लगता है कि यह IE8 + से डिफ़ॉल्ट रूप से स्थापित है। मुझे समझ नहीं आया कि आपने क्या लिखा है alert
गेदरॉन

1
@PeanutsMonkey। 1.return इसे अनदेखा किए जाने के बाद आपके पास कोड नहीं हो सकता । 2. आपको त्रुटियां या चेतावनी नहीं मिलेगी। इस DEMO को देखें
gdoron

9

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

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

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

arguments[0]
arguments[1]
arguments[2]
  • जावास्क्रिप्ट - निश्चित गाइड, 5 वें संस्करण

7

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

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

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

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

उसी टोकन के द्वारा, आप बिना किसी पैरामीटर के किसी फ़ंक्शन को परिभाषित कर सकते हैं, और फिर उन्हें argumentsऑब्जेक्ट के माध्यम से "ढूंढ" सकते हैं :

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

तो यह काफी नहीं है पहले फ़ंक्शन के समान , लेकिन यह व्यावहारिक रूप से गिनती करने वाले अधिकांश तरीकों के करीब है।

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


क्या आप आगे विस्तार से बता सकते हैं कि आपके optionalसाथ-साथ "वास्तव में एक मूल्य नहीं" मूल्य undefinedक्या है?
मूँगफली के दाने

@PeanutsMonkey - यदि वैरिएबल नहीं दिया गया है, तो यह होगा undefined
डेरेक 會 會 ere

@ संकेत - आपका क्या मतलब है कि इस बात की कोई गारंटी नहीं है कि घोषित मापदंडों में से कोई भी वास्तव में एक मूल्य के लिए बाध्य होगा?
मूँगफली के दाने

1
@PeanutsMonkey जावास्क्रिप्ट एक गतिशील भाषा है । जब बुला एक समारोह, समारोह की घोषणा मानकों की संख्या सहित महत्वपूर्ण नहीं है,। इस प्रकार, आप अपनी इच्छानुसार किसी फ़ंक्शन को कई मापदंडों के साथ घोषित कर सकते हैं, लेकिन आपके फ़ंक्शन को कॉल करने पर कितने पैरामीटर वास्तव में पारित किए जाते हैं, इस पर कोई प्रतिबंध नहीं है। (इस तरह, यह पुराने दिनों की तरह सी, कम से कम सी की तरह है।) इस प्रकार, यदि आप एक पैरामीटर की घोषणा करते हैं और कॉल बिना किसी पैरामीटर मान के आपूर्ति की जाती है, तो पैरामीटर होगा undefined
पॉइन्टी

3

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

यदि आप कोई मान पास नहीं करते हैं, तो पैरामीटर है 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]

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

@ मूंगफली: हाँ? तुम्हारी समस्या क्या है?
रॉकेट हज़मत

प्रति से एक समस्या नहीं है। मैं डेविड को और अधिक मापदंडों को पारित करने के बारे में अपने अनुवर्ती प्रश्न का उल्लेख कर रहा था जिसे आपने अपने उत्तर में शामिल किया है। क्या मैं काफी का पालन नहीं है आप क्या मतलब है logs? यह कहाँ लॉग इन करता है?
मूँगफली के दाने

1
@PeanutsMonkey: यह इसे आपके "जावास्क्रिप्ट कंसोल" में जोड़ता है। अधिकांश ब्राउज़रों में आप इसे दबा सकते हैं F12या Ctrl+Shift+Jप्राप्त कर सकते हैं।
रॉकेट हज़मत

1
पहला वाक्य ईएस २०१५ की तारीख से बाहर है ...
विधर्मी बंदर

2

आप फ़ंक्शन में उल्लिखित एक से अधिक तर्क भी प्रदान कर सकते हैं

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

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


@ अल्बर्ट तर्कों में इसकी सरणी नहीं है जैसे ऑब्जेक्ट देखें
माही

1

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

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

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

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


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

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

1
क्योंकि तुम कुछ भी नहीं लौटा रहे हो। आपको अपने उदाहरण में स्पष्ट रूप से एक मान वापस करना होगा: या तो return calc; या return a+b;(अंतिम पंक्ति के रूप में, स्पष्ट रूप से; और बाद returnके स्थान पर var calc)।
डेविड कहते हैं

तो मेरा मतलब है कि मुझे एक चर घोषित नहीं करना है अगर मैं करता हूं return a+b;?
मूँगफली के दाने

@ मूंगफली - आप अधिक पढ़ सकते हैं return यहाँ
डेरेक 會 會 ere

0

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

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


0

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

console.log(x) 

VM1533 देता है: 1 बिना पढ़ा संदर्भ: एक्स परिभाषित नहीं किया गया है

function test(x) {
console.log(x)
}
test(); 

अपरिभाषित देता है। ऐसा इसलिए है क्योंकि फ़ंक्शन परीक्षण () ब्राउज़र द्वारा फिर से लिखा गया है:

function test(x) {
    var x;
    console.log(x)
    }

एक और उदाहरण : -

var x =5 ;
function test(x) {
console.log(x)
}
test(); 

अभी भी अपरिभाषित है क्योंकि फ़ंक्शन बन जाता है

function test(x) {
    var x;
    console.log(x)
    }

नीचे दिए गए उदाहरण में चेतावनी अपरिभाषित होगी: -

    var x =5;
    function test() {
    alert(x);
    var x =10;
    }

test(); 

उपरोक्त समारोह बन जाएगा: -

 function test() {
    var x;
    alert(x);
    x =10;
    }

किसी फ़ंक्शन के अंदर जावास्क्रिप्ट चर का कार्य फ़ंक्शन स्तर गुंजाइश है और ब्लॉक स्तर नहीं है। उदाहरण के लिए

function varScope() {

for(var i = 0; i < 10; i++){
    for(var j = 0; j < 5; j++){}
        console.log("j is "+j)
    }
    console.log("i is "+i);


}
varScope();

उत्पादन के रूप में दे देंगे:

j is 5 
i is 10

फिर से समारोह बन गया है: -

  function varScope() {
    var i;
    var j;
    for(i = 0; i < 10; i++){
        for(j = 0; j < 5; j++){}
            console.log("j is "+j)
        }
        console.log("i is "+i);
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.