Điều này đang làm, được giao lại undefined
-undefined
bên trong đóng cửa đó. Đó là một failsafe.Bởi vì mã khác có thể vô tình làm điều gì đó như
undefined = something;
console.log(undefined); // will output 'something'
và thats hợp lệ trong javascript (nếu động cơ JS đang được sử dụng đã không được thực hiện ECMAScript 5 đặc điểm kỹ thuật, trong ECMAScript 5 đặc tả undefined
là phi non-writable
, MDN DOC),
Trích dẫn từ MDN New_in_JavaScript 1.8.5 (ECMA 5) trang
thay đổi các đối tượng toàn cầu
đối tượng toàn cầu khiến chỉ đọc
Các NaN, Infinity và không xác định toàn cầu đối tượng đã được thực hiện chỉ đọc, mỗi đặc tả ECMAScript 5.
Và từ ES5 Annotated Spec
trong Guthub
ES5 spec Section
x15.1.1.3
15.1.1.3 không xác định
Giá trị không xác định là undefined (xem 8.1).
Thuộc tính này có các thuộc tính {[[Có thể ghi]]: false, [[Có thể đếm được]]: false, [[Configurable]]: false}.
Thậm chí nếu global undefined
không thể ghi Bạn có thể có một biến địa phương tên là undefined
và có thể mess up mã của bạn (chủ yếu là so sánh với undefined
). Nhưng đó là trách nhiệm của bạn. Mã có thể được như
(function(){
console.log('Second Case: ');
var undefined = 'Something';
console.log(undefined); // Will log `something`
var a ; // a is undefined
console.log(a === undefined); // false, as undefined is changed
// you might expect a === undefined will return true, but as
// `undefined` is changed it will return false.
console.log(a); // undefined
})();
Demo:http://jsfiddle.net/joycse06/V4DKN/
Tuy nhiên nếu undefined
là có khả năng ghi thì việc chuyển nhượng trên có thể cản trở nhiều comparison
thực hiện với undefined
sau đó dòng mã như undefined
không phải là undefined
nữa. Nó có một số giá trị bây giờ.
Vì vậy, khi chúng được gọi là chức năng ẩn danh như
(window) // one argument only
Và nhận
(window, undefined) // only window is passed when calling the function
// Second argument is not passed means it's undefined
// so undefined is restored to undefined inside that function
// and no global accidental assignments can hamper jQuery's
// code using 'undefined' now
Điều đó có nghĩa bên trong đóng cửa mà undefined
được phục hồi để undefined
, vì nó đã không được thông qua bất kỳ giá trị như vậy, đảm bảo sử dụng undefined
bên trong hàm ẩn danh đó.
Một bài báo chi tiết rất tốt về vấn đề này http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/
Tôi trích dẫn một số dòng từ liên kết bài viết ở trên để làm cho mọi việc rõ ràng
là gì không xác định?
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 (loại) là loại JavaScript được tích hợp sẵ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ả định giá trị không xác định. (ECMA 4.3.9 và 4.3.10).
Hàm không có câu lệnh trả về hoặc hàm có khai báo trống trả về không xác định. Giá trị của đối số hàm unsupplied 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 tài sản toàn cầu mà ban đầu giá trị là undefined (giá trị), từ một tài sản toàn cầu của mình, chúng tôi cũng có thể truy cập vào nó như là một biến. Để nhất quán, tôi 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"
Tính đến ECMA 3, giá trị của nó có thể được bố trí:
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, lại gán giá trị cho biến không xác định là thực hành rất xấu, và trong thực tế nó không được phép bởi ECMA 5.
Related: http://stackoverflow.com/q/5020479/ – CMS
Liên quan: [Tại sao window.undefined có thể thay đổi trong trình duyệt cũ?] (Https://stackoverflow.com/q/29742135/1048572) – Bergi