Trong nỗi ám ảnh của họ để sắp xếp các chữ số, nhà phát triển đã vô tình khởi tạo biến b
với một chữ bát phân. Chế độ không nghiêm ngặt sẽ diễn giải điều này dưới dạng chữ số có giá trị 24
(trong cơ sở 10). Tuy nhiên, chế độ nghiêm ngặt sẽ ném một lỗi.
Phạm vi
Trong lịch sử, JavaScript đã bị nhầm lẫn về cách các chức năng được phân chia. Đôi khi chúng dường như có phạm vi tĩnh, nhưng một số tính năng làm cho chúng hoạt động giống như chúng có phạm vi động. Điều này là khó hiểu, làm cho các chương trình khó đọc và hiểu. Hiểu lầm gây ra lỗi. Nó cũng là một vấn đề cho hiệu suất. Phạm vi tĩnh sẽ cho phép liên kết biến xảy ra tại thời điểm biên dịch, nhưng yêu cầu đối với phạm vi động có nghĩa là ràng buộc phải được hoãn lại trong thời gian chạy, đi kèm với một hình phạt hiệu suất đáng kể.
Chế độ nghiêm ngặt yêu cầu tất cả các ràng buộc biến được thực hiện tĩnh. Điều đó có nghĩa là các tính năng yêu cầu ràng buộc động trước đây phải được loại bỏ hoặc sửa đổi. Cụ thể, câu lệnh with bị loại bỏ và khả năng can thiệp vào chức năng của người gọi bị hạn chế nghiêm trọng.
Một trong những lợi ích của mã nghiêm ngặt là các công cụ như YUI Compressor
có thể thực hiện công việc tốt hơn khi xử lý nó.
Biến toàn cầu
JavaScript đã ngụ ý các biến toàn cầu. Nếu bạn không khai báo rõ ràng một biến, một biến toàn cục sẽ được khai báo ngầm cho bạn. Điều này làm cho việc lập trình dễ dàng hơn cho người mới bắt đầu vì họ có thể bỏ qua một số công việc vệ sinh cơ bản. Nhưng nó làm cho việc quản lý các chương trình lớn trở nên khó khăn hơn nhiều và nó làm giảm đáng kể độ tin cậy. Vì vậy, trong chế độ nghiêm ngặt, các biến toàn cục ngụ ý không còn được tạo. Bạn nên khai báo rõ ràng tất cả các biến của bạn.
Rò rỉ toàn cầu
Có một số tình huống có thể gây ra this
ràng buộc với đối tượng toàn cầu. Ví dụ: nếu bạn quên cung cấp new
tiền tố khi gọi hàm xây dựng, thì hàm tạo this
sẽ bị ràng buộc bất ngờ với đối tượng toàn cục, vì vậy thay vì khởi tạo một đối tượng mới, thay vào đó, nó sẽ âm thầm giả mạo các biến toàn cục. Trong những tình huống này, chế độ nghiêm ngặt thay vào đó sẽ liên kết this
với undefined
, điều này sẽ khiến cho hàm tạo thay một ngoại lệ, cho phép lỗi được phát hiện sớm hơn nhiều.
Thất bại ồn ào
JavaScript luôn có các thuộc tính chỉ đọc, nhưng bạn không thể tự tạo chúng cho đến khi Object.createProperty
chức năng của ES5 thể hiện khả năng đó. Nếu bạn đã cố gán giá trị cho thuộc tính chỉ đọc, nó sẽ thất bại trong âm thầm. Việc chuyển nhượng sẽ không thay đổi giá trị của tài sản, nhưng chương trình của bạn sẽ tiến hành như thể nó đã có. Đây là một mối nguy toàn vẹn có thể khiến các chương trình đi vào trạng thái không nhất quán. Trong chế độ nghiêm ngặt, cố gắng thay đổi thuộc tính chỉ đọc sẽ đưa ra một ngoại lệ.
Octal
Biểu diễn số bát phân (hoặc cơ sở 8) cực kỳ hữu ích khi thực hiện lập trình cấp máy trên các máy có kích thước từ là bội số của 3. Bạn cần bát phân khi làm việc với máy tính lớn CDC 6600, có kích thước từ là 60 bit. Nếu bạn có thể đọc bát phân, bạn có thể xem một từ có 20 chữ số. Hai chữ số đại diện cho mã op và một chữ số xác định một trong 8 thanh ghi. Trong quá trình chuyển đổi chậm chạp từ mã máy sang ngôn ngữ cấp cao, việc cung cấp các hình thức bát phân trong các ngôn ngữ lập trình được cho là hữu ích.
Trong C, một đại diện cực kỳ đáng tiếc của bát phân đã được chọn: Dẫn đầu số không. Vì vậy, trong C, 0100
có nghĩa là 64, không phải 100 và 08
là lỗi, không phải 8. Không may hơn nữa, lỗi thời này đã được sao chép sang gần như tất cả các ngôn ngữ hiện đại, bao gồm cả JavaScript, nơi nó chỉ được sử dụng để tạo ra lỗi. Nó không có mục đích nào khác. Vì vậy, trong chế độ nghiêm ngặt, các hình thức bát phân không còn được phép.
Vân vân
Mảng giả đối số trở nên giống mảng hơn một chút trong ES5. Trong chế độ nghiêm ngặt, nó mất callee
và caller
thuộc tính của nó . Điều này làm cho nó có thể chuyển arguments
mã của bạn đến mã không tin cậy mà không từ bỏ nhiều bối cảnh bí mật. Ngoài ra,
arguments
tài sản của các chức năng được loại bỏ.
Trong chế độ nghiêm ngặt, các khóa trùng lặp trong một hàm bằng chữ sẽ tạo ra lỗi cú pháp. Một hàm không thể có hai tham số có cùng tên. Một hàm không thể có một biến có cùng tên với một trong các tham số của nó. Một hàm không thể delete
biến riêng của nó. Một nỗ lực cho
delete
một tài sản không thể cấu hình bây giờ ném một ngoại lệ. Giá trị nguyên thủy không được bao bọc ngầm.
ECMAScript 5 thêm một danh sách các từ dành riêng. Nếu bạn sử dụng chúng làm biến hoặc đối số, chế độ nghiêm ngặt sẽ gây ra lỗi. Các từ dành riêng là: