Tôi không hiểu tại sao, ở chế độ nghiêm ngặt, lỗi cú pháp xảy ra khi delete
được sử dụng trên số nhận dạng không đủ điều kiện.Động cơ đằng sau lỗi cú pháp chế độ nghiêm ngặt khi xóa số nhận dạng không đủ tiêu chuẩn?
Trong hầu hết các trường hợp, có nghĩa là ... nếu bạn khai báo biến theo cách thông thường với từ khóa var
, và sau đó cố gắng sử dụng delete
trên chúng, ở chế độ không nghiêm ngặt, nó sẽ tự động không thành công ý nghĩa cho chế độ nghiêm ngặt thất bại với một lỗi trong những trường hợp đó.
Tuy nhiên, có những trường hợp bạn không thể xóa định rằng là trình độ:
(function() {
// "use strict";
var obj = Object.create({}, { bloop: { configurable: false } });
delete obj.bloop; // throws TypeError in strict mode, silently fails in non-strict.
console.log('bloop' in obj); // true
}());
chế độ nghiêm ngặt phải làm một kiểm tra thời gian chạy ở đây, bởi vì một TypeError được ném khi điều này là gặp phải. Ngoài ra còn có những trường hợp bạn thể thành công xóa định không đủ tiêu chuẩn trong chế độ không nghiêm ngặt ...
// "use strict";
window.bar = 6;
console.log(typeof bar); // number
delete bar; // works in non-strict, syntax error in strict!
console.log(typeof bar); // undefined
Trong thực tế, sự hiểu biết của tôi, hay không, bạn có thể xóa mọi thứ (trong chế độ không nghiêm ngặt) phụ thuộc trên thuộc tính nội bộ [[Configurable]]
và không liên quan gì đến các số nhận dạng đủ điều kiện. Theo như tôi có thể nói, không có cách nào trong chế độ nghiêm ngặt để xóa các đại lượng không toàn cầu (như tính chất của VO địa phương) là cấu hình:
(function() {
// "use strict";
eval('var foo = 5;');
console.log(typeof foo); // number
delete foo; // works in non-strict, SyntaxError in strict.
console.log(typeof foo); // undefined
}());
Vì vậy, câu hỏi của tôi là, điểm là những gì of throwing a SyntaxError khi sử dụng delete
trên một định danh không đủ tiêu chuẩn, khi TypeError sẽ ném anyway nếu thuộc tính không cấu hình được? Điều này có vẻ như một hạn chế không cần thiết, và trong một số trường hợp dường như không có bất kỳ giải pháp nào khác ngoài việc không sử dụng chế độ nghiêm ngặt (ví dụ thứ ba). Bất cứ ai có thể giải thích động cơ đằng sau quyết định này?
Cập nhật: Tôi chỉ nhận ra rằng tôi đã nhìn ra thực tế là trực tiếp eval
cuộc gọi có phạm vi riêng của họ trong chế độ nghiêm ngặt, thay vì phạm vi chức năng gọi điện thoại, vì vậy trong ví dụ thứ ba foo
sẽ không được xác định theo chế độ nghiêm ngặt . Dù sao, kiểm tra thời gian chạy vẫn sẽ bắt được điều này, nhưng nó đặt ra một câu hỏi phụ: Không có cách nào để có các biến cục bộ có thể cấu hình ở chế độ nghiêm ngặt, như chúng ta thực hiện với khai báo biến không phải là nghiêm ngặt của eval
? AFAIK là một trong số ít sử dụng hợp pháp của eval
.
Chính xác những gì bạn có ý nghĩa bởi "(un) định đủ điều kiện"? Tôi không thể tìm thấy thuật ngữ đó trong thông số kỹ thuật. – user123444555621
@ Pumbaa80 một số nhận dạng không có dấu chấm trong đó. :) –
@ Pumbaa80 '(function() {" sử dụng nghiêm ngặt "; var foo; delete foo;}())' ... chromium: 'SyntaxError: Xóa số nhận dạng không đủ tiêu chuẩn ở chế độ nghiêm ngặt.' –