जावास्क्रिप्ट और कार्य और डिफ़ॉल्ट पैरामीटर, IE और क्रोम में काम नहीं कर रहे हैं


101

मैंने इस तरह एक समारोह बनाया:

function saveItem(andClose = false) {

}

यह फ़ायरफ़ॉक्स में ठीक काम करता है

IE में यह कंसोल पर यह त्रुटि देता है: Expected ')'

Chrome में यह कंसोल में यह त्रुटि देता है: Uncaught SyntaxError: Unexpected token =

दोनों ब्राउज़र फ़ंक्शन क्रिएशन लाइन के रूप में त्रुटि के स्रोत को चिह्नित करते हैं।


Android स्टॉक ब्राउज़र 5.1.1 यहाँ, एक ही मुद्दा।
जे.सी.

जवाबों:


152

आप ऐसा नहीं कर सकते, लेकिन आप इसके बजाय कुछ कर सकते हैं:

function saveItem(andClose) {
   if(andClose === undefined) {
      andClose = false;
   }
}

यह अक्सर कुछ इस तरह से छोटा होता है:

function setName(name) {
  name = name || 'Bob';
}

अपडेट करें

उपरोक्त ECMAScript <= 5. के लिए सही है। ES6 ने डिफ़ॉल्ट पैरामीटर प्रस्तावित किया है । इसलिए इसके बजाय ऊपर पढ़ा जा सकता है:

function setName(name = 'Bob') {}

14
यह IE11 और उसके तहत उपयोगी है, जो ES6 को लागू नहीं करता है और डिफ़ॉल्ट मापदंडों पर टूटता है।
एरन गोल्डिन

2
धन्यवाद!! नहीं पता था कि! IE बेकार है, लेकिन डेवलपर्स के पास "गैर" -browser का समर्थन करने के अलावा कोई विकल्प नहीं है।
Fr0zenFyr

4
name = name || 'Bob';उपयोग नहीं किया जाना चाहिए क्योंकि यदि नाम एक गलत मूल्य पर सेट है, तो डिफ़ॉल्ट का उपयोग नाम के बजाय किया जाएगा
जेरार्ड सिम्पसन

9
name = name || 'Bob'उपयोग के बजायname = (name === undefined) ? '' : name;
ब्रायन

1
@ जूको मुझे समझ नहीं आता "आप ऐसा नहीं कर सकते" - मोज़िला एमडीएन का कहना है कि हम कर सकते हैं? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… क्या आप केवल यह कह रहे हैं कि आप इसे IE में नहीं कर सकते हैं या आप कह रहे हैं कि मोज़िला डॉक्स गलत हैं?
php-b-grader

13

यह एक मान्य ECMAScript सिंटैक्स नहीं है, लेकिन यह मोज़िला के उन सुविधाओं के सुपरसेट के लिए एक मान्य सिंटैक्स है जो वे भाषा के अपने कार्यान्वयन में जोड़ते हैं।

डिफ़ॉल्ट पैरामीटर असाइनमेंट सिंटैक्स ECMAScript 6 में आने की संभावना है


1
ठीक है, तो जावास्क्रिप्ट कार्यों में डिफ़ॉल्ट मान सेट करने का सबसे अच्छा तरीका क्या है?
Talon

1
@ टन: सबसे अच्छा तरीका आपकी स्थिति पर निर्भर करता है। यदि आप जानते हैं कि तर्क गलत नहीं होगा, तो आप कर सकते हैं foo = foo || "the default"। या आप ऑब्जेक्ट .lengthकी जांच कर सकते हैं arguments। या आप बस के लिए प्रत्येक पैरामीटर का परीक्षण कर सकते हैं undefined। प्रत्येक का उपयोग करने के लिए अलग-अलग अवसर हैं।
सिस्टम

8

जावास्क्रिप्ट "डिफ़ॉल्ट" निर्दिष्ट करने की अनुमति नहीं देता है।

आप क्या चाहते हैं करने का एक त्वरित तरीका बदल रहा है:

function saveItem(andClose = false) {

}

निम्नलिखित के लिए:

function saveItem(andClose) {
    // this line will check if the argument is undefined, null, or false
    // if so set it to false, otherwise set it to it's original value
    var andClose = andClose || false;

    // now you can safely use andClose
    if (andClose) {
        // do something
    }
}

1
यह andCloseगलत था, यह 0 था ... मैं इसे करने की अपेक्षा नहीं कर रहा था ...
गॉर्डन मोनिका

@gdoron इसे देखें: stackoverflow.com/questions/7615214/… ये वे क्विर्क हैं जिन्हें आपको किसी भी भाषा के बारे में जानने की आवश्यकता है जिसका आप उपयोग करते हैं।
JRomero

तीसरी पंक्ति को बदलना एक विकल्प है, var andClose = andClose === undefined? false: andClose;जो आपको 0फ़ंक्शन को पास करने में सक्षम करेगा और इसे इसके साथ प्रतिस्थापित नहीं करेगा false
मैक्स हाइबर

2

आपके द्वारा प्रदान किया गया कोड Chrome में नहीं चलेगा <संस्करण 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

आपने मान्य ECMAScript 2015 सिंटैक्स का उपयोग किया है:

मेरी राय में, ES2015 सुविधाओं का उपयोग करने का सबसे अच्छा तरीका है ब्राउज़र या वेबपैक के साथ परिसंपत्तियों को बंडल करना , बाबेल का उपयोग करने के लिए ES2015 से ES5 को ट्रांस-संकलित करने के लिए एक कदम के साथ । इस तरह से आपको उस ES2015 ब्राउज़र संगतता चार्ट के बारे में चिंता करने की ज़रूरत नहीं है। पहली बार शुरू करने के लिए यह एक दर्द है, लेकिन इसके लायक है।


0

आपके मामले में, आपके पास यह सुनिश्चित करने के लिए एक अन्य विकल्प है कि आपका चर बूलियन है:

function saveItem(andClose) {
  var andClose = true == andClose;
  // ...
}

डिफ़ॉल्ट मान है undefined, और true == undefined=> false, इसलिए आपका डिफ़ॉल्ट मान होगा false:)


एक मामूली समायोजन वैर घोषणा को हटाने के लिए होगा क्योंकि andCloseचर पहले से ही इस दायरे में सौंपा गया है
बेन सीयर्ड्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.