2016-09-14 30 views
8

Trong khi cố gắng để gỡ lỗi một số phần bị lỗi JavaScript, tôi tìm thấy một dòng đó trông giống như một sai lầm rõ ràng trong một tập tin nguồn:Tại sao false ++ tạo cú pháp SyntaxError trong Firefox nhưng một tham chiếu trong Chrome?

false++; 

Những gì tôi không undestand là lý do tại sao bản Tuyên Bố này cư xử khác nhau trong tất cả các trình duyệt.

  • Trong Chrome, tôi nhận được ReferenceError và toàn bộ tập lệnh không được chạy.
  • Trong Firefox, tôi nhận được cú pháp SyntaxError và toàn bộ tập lệnh không được chạy.
  • Trong Internet Explorer, tôi nhận được cú pháp SyntaxError và tập lệnh chỉ chạy cho đến khi xảy ra lỗi.

Theo thiết kế, các trình duyệt khác nhau có được phép xử lý cùng một JavaScript bị hỏng theo các cách khác nhau không?

Tôi biết lỗi là gì và cách sửa lỗi, nhưng không nên ít nhất là loại lỗi được bắt buộc bởi thông số kỹ thuật?

+0

Thông số nói gì? – Teemu

+3

@Teemu Tôi không biết. Bạn có? – Lynn

+3

Đó phải là lỗi tham chiếu, xem [* ECMA-262 §12.4.1 *] (http://ecma-international.org/ecma-262/7.0/index.html#sec-update-expressions-static-semantics -early-errors): * Đây là lỗi tham chiếu ban đầu nếu IsValidSimpleAssignmentTarget của LeftHandSideExpression là sai. * Toán tử postfix cố gắng sửa đổi giá trị, * false * là không thay đổi nên không phải là một mục tiêu gán đơn giản hợp lệ. – RobG

Trả lời

5

Chrome dường như được cập nhật.

  • Trong ES6ES7 một ReferenceError được ném khi cố gắng assign to a primary expression đó là một chữ (chẳng hạn như false) không phải là một định danh.
  • Trong ES5 lỗi sớm (mà thường là SyntaxError s) loại không xác định được ném cho các bài tập "trên bất kỳ giá trị mà một quyết tâm sớm có thể được thực hiện mà giá trị không phải là một Reference", mặc dù if it would happen một ReferenceError sẽ được ném để người ta có thể lập luận rằng lỗi sớm nên thuộc loại đó.
  • Trong ES3, các mô tả về tình trạng lỗi tương tự như ES5, nhưng nó chỉ nói rằng "một thực thể [sic!] đối xử với bất kỳ trường hợp của các loại sau đây của lỗi thời gian chạy như một lỗi cú pháp và do đó báo cáo nó sớm ".
  • Trong ES1 và ES2 không có loại lỗi và không xử lý ngoại lệ và gán cho thứ không phải là tham chiếu chỉ được gọi là "tạo lỗi thời gian chạy". Việc triển khai được phép báo cáo sớm vào thời gian biên dịch, nếu họ có thể chứng minh rằng lỗi sẽ xảy ra trong bất kỳ trường hợp nào.

Trong khi xử lý lỗi trong Firefox có thể được miễn bằng ngôn từ ES5 hoặc ES3, hành vi Internet Explorer ném một thời gian chạy SyntaxError không khớp với bất kỳ điều nào trong số này. Tuy nhiên, Microsoft có kế hoạch fix this in Chakra. Để thảo luận thêm, xem https://github.com/tc39/ecma262/issues/257https://github.com/tc39/ecma262/issues/691.

0

Chỉ cần đoán, nhưng có thể Firefox kiểm tra lỗi cú pháp trước, & Chrome kiểm tra lỗi tham chiếu trước. Lỗi đầu tiên được ném, & không còn nữa. Lý do chính cho lỗi là false là một Boolean, không phải là một giá trị Integer hoặc số, do đó nó không thể được tăng hoặc giảm. Nếu không nhìn thấy mã nguồn, tôi sẽ thử thay đổi false thành một cái gì đó như var falseCount.

Các vấn đề liên quan