ฟังก์ชัน Javascript และพารามิเตอร์เริ่มต้นไม่ทำงานใน IE และ Chrome


104

ฉันสร้างฟังก์ชันดังนี้:

function saveItem(andClose = false) {

}

ทำงานได้ดีใน Firefox

ใน IE จะให้ข้อผิดพลาดนี้บนคอนโซล: Expected ')'

ใน Chrome จะให้ข้อผิดพลาดนี้ในคอนโซล: Uncaught SyntaxError: Unexpected token =

เบราว์เซอร์ทั้งสองทำเครื่องหมายแหล่งที่มาของข้อผิดพลาดเป็นบรรทัดการสร้างฟังก์ชัน


เบราว์เซอร์ Android 5.1.1 ที่นี่ปัญหาเดียวกัน
jc

คำตอบ:


156

คุณไม่สามารถทำได้ แต่คุณสามารถทำสิ่งต่อไปนี้แทนได้

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

สิ่งนี้มักถูกย่อให้สั้นลงเช่น:

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

อัปเดต

ดังกล่าวข้างต้นเป็นจริงสำหรับ ECMAScript <= 5. ES6 ได้เสนอค่าเริ่มต้น ดังนั้นข้างต้นสามารถอ่านแทน:

function setName(name = 'Bob') {}

14
สิ่งนี้มีประโยชน์สำหรับ IE11 และต่ำกว่าซึ่งไม่ได้ใช้ ES6 และทำลายพารามิเตอร์เริ่มต้น
Eran Goldin

2
ขอบคุณ !! ไม่รู้! IE ห่วย แต่นักพัฒนาไม่มีทางเลือกอื่นนอกจากสนับสนุน "ไม่ใช่" - เบราว์เซอร์
Fr0zenFyr

4
name = name || 'Bob';ไม่ควรใช้เพราะหากตั้งชื่อเป็นค่าเท็จค่าเริ่มต้นจะถูกใช้แทนชื่อ
เจอราร์ดซิมป์สัน

10
แทนที่จะname = name || 'Bob'ใช้ name = (name === undefined) ? '' : name;
Brian

1
@juco ฉันไม่เข้าใจว่า "คุณทำสิ่งนี้ไม่ได้" - Mozilla MDN บอกว่าเราทำได้? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… คุณแค่บอกว่าทำใน IE ไม่ได้หรือคุณบอกว่าเอกสาร Mozilla ไม่ถูกต้อง?
php-b-grader

14

นั่นไม่ใช่ไวยากรณ์ ECMAScript ที่ถูกต้อง แต่เป็นไวยากรณ์ที่ถูกต้องสำหรับชุดคุณสมบัติพิเศษของ Mozilla ที่เพิ่มเข้าไปในการใช้งานภาษา

ไวยากรณ์การกำหนดพารามิเตอร์เริ่มต้นน่าจะมาใน ECMAScript 6


1
ตกลงแล้ววิธีที่ดีที่สุดในการตั้งค่าเริ่มต้นในฟังก์ชัน Javascript คืออะไร?
Talon

1
@Talon: วิธีที่ดีที่สุดขึ้นอยู่กับสถานการณ์ของคุณ ถ้าคุณรู้ว่าอาร์กิวเมนต์จะไม่ falsey foo = foo || "the default"คุณสามารถทำได้ หรือคุณสามารถตรวจสอบ.lengthของargumentsวัตถุ undefinedหรือคุณสามารถทดสอบพารามิเตอร์แต่ละ มีโอกาสที่จะใช้แตกต่างกัน
ระบบ

8

Javascript ไม่อนุญาตให้ใช้ตัวระบุ "ค่าเริ่มต้น"

วิธีที่รวดเร็วในการทำสิ่งที่คุณต้องการคือการเปลี่ยนแปลง:

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 สนับสนุน Monica

@gdoron ดูสิ่งนี้: stackoverflow.com/questions/7615214/…นี่คือนิสัยใจคอที่คุณต้องเรียนรู้เกี่ยวกับภาษาใด ๆ ที่คุณใช้
JRomero

อีกทางเลือกหนึ่งคือการเปลี่ยนบรรทัดที่สามในการvar andClose = andClose === undefined? false: andClose;ที่จะช่วยให้คุณสามารถที่จะผ่านไปยังฟังก์ชันและไม่ได้ถูกแทนที่ด้วย0 false
Max Heiber

2

โค้ดที่คุณระบุจะไม่ทำงานใน Chrome <เวอร์ชัน 49: https://kangax.github.io/compat-table/es6/#test-default_function_parameters

คุณใช้ไวยากรณ์ ECMAScript 2015 ที่ถูกต้อง:

ในความคิดของฉันวิธีที่ดีที่สุดในการใช้คุณสมบัติ ES2015 คือการรวมเนื้อหากับBrowserifyหรือWebPackโดยมีขั้นตอนในการใช้Babelเพื่อแปลงไฟล์ ES2015 เป็น ES5 ด้วยวิธีนี้คุณไม่ต้องกังวลเกี่ยวกับแผนภูมิความเข้ากันได้ของเบราว์เซอร์ ES2015 การเริ่มต้นครั้งแรกมันเจ็บปวด แต่ก็คุ้มค่า


1

ในกรณีของคุณคุณมีทางเลือกอื่นเพื่อให้แน่ใจว่าตัวแปรของคุณเป็นบูลีน:

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

ค่าเริ่มต้นคือundefinedและtrue == undefined=> falseดังนั้นค่าเริ่มต้นของคุณจะเป็นfalse:)


การปรับปรุงเล็กน้อยอย่างหนึ่งคือการลบการประกาศ var เนื่องจากandCloseตัวแปรถูกกำหนดไว้แล้วในขอบเขตนี้
Ben Sewards

ถ้าคุณอยากจะให้แน่ใจว่ามันเป็นแบบบูลและไม่สตริง 'ความจริง' ที่เปลี่ยนไปandClose = true === andClose;
JanP

คุณถูกทั้งคู่ :)
Cédric Talpaert
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.