Tại sao chức năng JavaScript của tôi không được xác định?
So với các ngôn ngữ khác, khái niệm không xác định của JavaScript hơi khó hiểu. Đặc biệt, cố gắng hiểu ReferenceErrors (“x không được xác định”) và cách tốt nhất để viết mã chống lại chúng có thể gây khó chịu Show Đây là nỗ lực của tôi để giải quyết mọi thứ một chút. Nếu bạn chưa quen với sự khác biệt giữa biến và thuộc tính trong JavaScript (bao gồm cả Biến đối tượng bên trong) thì bây giờ có thể là thời điểm tốt để xem bài đăng trước của tôi Không xác định là gì?Trong JavaScript có Không xác định (loại), không xác định (giá trị) và không xác định (biến). không xác định (giá trị) là nguyên thủy và là giá trị duy nhất của loại Không xác định. Bất kỳ thuộc tính nào chưa được gán giá trị, giả sử giá trị typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined"2. (ECMA4. 3. 9 và 4. 3. 10). Hàm không có câu lệnh trả về hoặc hàm có câu lệnh trả về trống trả về không xác định. Giá trị của một đối số hàm không được cung cấp là không xác định var a; typeof a; //"undefined" window.b; typeof window.b; //"undefined" var c = (function() {})(); typeof c; //"undefined" var d = (function(e) {return e})(); typeof d; //"undefined" không xác định (biến) là một thuộc tính toàn cầu có giá trị ban đầu là không xác định (giá trị), Vì đây là thuộc tính toàn cầu nên chúng ta cũng có thể truy cập nó dưới dạng một biến. Để thống nhất, tôi sẽ luôn gọi nó là một biến trong bài viết này typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined" Kể từ ECMA 3, giá trị của nó có thể được gán lại undefined = "washing machine"; //assign a string to undefined (variable) typeof undefined //"string" f = undefined; typeof f; //"string" f; //"washing machine" Không cần phải nói, việc gán lại các giá trị cho biến không xác định là một cách làm rất tồi và trên thực tế, nó không được ECMA 5 cho phép (mặc dù trong số các bản phát hành trình duyệt đầy đủ hiện tại, chỉ có Safari thực thi điều này) Và sau đó có null?Có, nói chung là hiểu rõ nhưng đáng nói lại. typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined"2 khác với typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined"4, đây cũng là một giá trị nguyên thủy thể hiện sự vắng mặt có chủ ý của một giá trị. Điểm giống nhau duy nhất giữa typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined"2 và typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined"4 là cả hai đều ép buộc sai Vậy ReferenceError là gì?ReferenceError chỉ ra rằng giá trị tham chiếu không hợp lệ đã được phát hiện (ECMA 5 15. 11. 6. 3) Về mặt thực tế, điều này có nghĩa là một ReferenceError sẽ được ném ra khi JavaScript cố gắng lấy giá trị của một tham chiếu không thể giải quyết. (Có những trường hợp khác sẽ xảy ra ReferenceError, đáng chú ý nhất là khi chạy ở chế độ ECMA 5 Strict. Nếu bạn quan tâm, hãy kiểm tra danh sách đọc ở cuối bài viết này) Lưu ý cách cú pháp tin nhắn khác nhau giữa các trình duyệt. Như chúng ta sẽ thấy không có thông điệp nào trong số này là đặc biệt khai sáng ________số 8Vẫn chưa rõ ràng…"tài liệu tham khảo không thể giải quyết"?Theo thuật ngữ ECMA, Tham chiếu bao gồm giá trị cơ sở và tên tham chiếu (ECMA 5 8. 7 - một lần nữa tôi đang lướt qua chế độ nghiêm ngặt. Cũng lưu ý rằng thuật ngữ ECMA 3 thay đổi đôi chút nhưng hiệu quả là như nhau) Nếu Tham chiếu là một thuộc tính, thì giá trị cơ sở và tên tham chiếu nằm ở hai bên của dấu chấm (hoặc dấu ngoặc đầu tiên hoặc bất kỳ thứ gì) window.foo; //base value = window, reference name = foo; a.b; //base value = a, reference name = b; myObj['create']; // base value = myObj, reference name = 'create'; //Safari, Chrome, IE8+ only Object.defineProperty(window,"foo", {value: "hello"}); //base value = window, reference name = foo; Đối với Tham chiếu biến, giá trị cơ sở là Đối tượng biến của ngữ cảnh thực thi hiện tại. Đối tượng biến của bối cảnh toàn cầu là chính đối tượng toàn cầu ( typeof undefined; //"undefined" var f = 2; f = undefined; //re-assigning to undefined (variable) typeof f; //"undefined"7 trong trình duyệt)). Mỗi ngữ cảnh chức năng có một Đối tượng biến trừu tượng được gọi là Đối tượng kích hoạt var a; typeof a; //"undefined" window.b; typeof window.b; //"undefined" var c = (function() {})(); typeof c; //"undefined" var d = (function(e) {return e})(); typeof d; //"undefined"1 Một tham chiếu được coi là không thể giải quyết nếu giá trị cơ sở của nó không được xác định Do đó, tham chiếu thuộc tính không thể giải quyết được nếu giá trị trước dấu chấm không được xác định. Ví dụ sau sẽ đưa ra ReferenceError nhưng không phải vì TypeError xuất hiện trước. Điều này là do giá trị cơ bản của thuộc tính tuân theo CheckObjectCoercible (ECMA 5 9. 10 qua 11. 2. 1) ném TypeError khi cố gắng chuyển đổi loại Không xác định thành Đối tượng. (cảm ơn kangax về mẹo đăng trước qua twitter) var a; typeof a; //"undefined" window.b; typeof window.b; //"undefined" var c = (function() {})(); typeof c; //"undefined" var d = (function(e) {return e})(); typeof d; //"undefined"2 Tham chiếu biến sẽ không bao giờ là không thể giải quyết được vì từ khóa var đảm bảo Biến đối tượng luôn được gán cho giá trị cơ sở Các tham chiếu không phải là thuộc tính hoặc biến theo định nghĩa là không thể giải quyết được và sẽ đưa ra ReferenceError var a; typeof a; //"undefined" window.b; typeof window.b; //"undefined" var c = (function() {})(); typeof c; //"undefined" var d = (function(e) {return e})(); typeof d; //"undefined"3 JavaScript không thấy giá trị cơ sở rõ ràng và do đó tra cứu Biến đối tượng cho thuộc tính có tên tham chiếu 'foo'. Không tìm thấy nó xác định 'foo' không có giá trị cơ sở và đưa ra ReferenceError Nhưng không phải |