Các chức năng và thông số mặc định của Javascript, không hoạt động trong IE và Chrome


101

Tôi đã tạo một hàm như thế này:

function saveItem(andClose = false) {

}

Nó hoạt động tốt trên Firefox

Trong IE, nó đưa ra lỗi này trên bảng điều khiển: Expected ')'

Trong Chrome, nó đưa ra lỗi này trong bảng điều khiển: Uncaught SyntaxError: Unexpected token =

Cả hai trình duyệt đều đánh dấu nguồn của lỗi là dòng tạo hàm.


Trình duyệt cổ phiếu Android 5.1.1 ở đây, cùng một vấn đề.
jc

Câu trả lời:


149

Bạn không thể làm điều này, nhưng thay vào đó bạn có thể làm điều gì đó như:

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

Điều này thường được rút ngắn thành một cái gì đó như:

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

Cập nhật

Điều trên đúng với ECMAScript <= 5. ES6 đã đề xuất các tham số Mặc định . Vì vậy, thay vào đó có thể đọc:

function setName(name = 'Bob') {}

14
Điều này hữu ích cho IE11 trở xuống, không triển khai ES6 và phá vỡ các tham số mặc định.
Eran Goldin

2
Cảm ơn!! Không biết điều đó! IE tệ nhưng các nhà phát triển không có lựa chọn nào khác ngoài hỗ trợ trình duyệt "non".
Fr0zenFyr

4
name = name || 'Bob';không nên dùng vì nếu tên được đặt thành một giá trị falsey, mặc định sẽ được sử dụng thay cho tên
Gerard Simpson

8
Thay vì name = name || 'Bob'sử dụng name = (name === undefined) ? '' : name;
Brian

1
@juco Tôi không hiểu "Bạn không thể làm điều này" - Mozilla MDN nói rằng chúng tôi có thể? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Bạn chỉ nói rằng bạn không thể làm điều đó trong IE hay bạn nói rằng tài liệu Mozilla không chính xác?
php-b-grader

13

Đó không phải là cú pháp ECMAScript hợp lệ, nhưng nó là cú pháp hợp lệ cho tập hợp siêu tính năng của Mozilla mà họ thêm vào việc triển khai ngôn ngữ của mình.

Cú pháp gán tham số mặc định có thể xuất hiện trong ECMAScript 6.


1
Ok, vậy cách tốt nhất để đặt giá trị mặc định trong các hàm Javascript là gì?
Talon

1
@Talon: Cách tốt nhất tùy thuộc vào tình hình của bạn. Nếu bạn biết lập luận sẽ không sai, bạn có thể làm foo = foo || "the default". Hoặc bạn có thể kiểm tra .lengthcác argumentsđối tượng. Hoặc bạn có thể chỉ cần kiểm tra từng tham số cho undefined. Có những dịp khác nhau để sử dụng mỗi.
hệ thống

8

Javascript không cho phép mã định nghĩa "mặc định".

Một cách nhanh chóng để làm những gì bạn muốn đang thay đổi:

function saveItem(andClose = false) {

}

theo sau:

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
nó sẽ thiết lập andCloselà false nó là 0 ... không khá gì tôi mong chờ nó để làm ...
gdoron đang hỗ trợ Monica

@gdoron xem này: stackoverflow.com/questions/7615214/…, đây là những điều bạn cần tìm hiểu về bất kỳ ngôn ngữ nào bạn sử dụng.
JRomero

một thay thế là thay đổi dòng thứ ba thành var andClose = andClose === undefined? false: andClose;Điều đó sẽ cho phép bạn chuyển 0đến hàm và không bị thay thế bằng false.
Số thừa kế tối đa

2

Mã bạn cung cấp sẽ không chạy trong Chrome <phiên bản 49: https://kangax.github.io/compat-table/es6/#test-default_ Chức năng_parameters

Bạn đã sử dụng cú pháp ECMAScript 2015 hợp lệ:

Theo tôi, cách tốt nhất để sử dụng các tính năng của ES2015 là kết hợp các nội dung với Browserify hoặc WebPack , với một bước sử dụng Babel để chuyển dịch ES2015 sang ES5. Bằng cách đó, bạn không phải lo lắng về biểu đồ tương thích của trình duyệt ES2015 đó. Lần đầu tiên bắt đầu thật khó khăn nhưng xứng đáng.


0

Trong trường hợp của bạn, bạn có một giải pháp thay thế khác để đảm bảo rằng biến của bạn là boolean:

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

Giá trị mặc định là undefined, và true == undefined=> false, vì vậy giá trị mặc định của bạn sẽ là false:)


Một điều chỉnh nhỏ sẽ là loại bỏ khai báo var vì andClosebiến đã được gán trong phạm vi này
Ben Sewards
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.