2017-07-18 38 views
5

Gần đây tôi điều tra, trong đó một lập trình viên vô tình trôi qua undefined vào addEventListener, như sau:Không thể xác định loại không xác định một tình huống()

window.addEventListener('load', undefined); 

Không có lỗi được ném. Nó giống như JavaScript sẵn sàng gọi undefined. Nhưng những gì trên thế giới undefined()? Tôi đã thử tất cả mọi thứ, ví dụ:

console.log(undefined() === null); 
console.log(typeof undefined()); 

nhưng tôi chưa bao giờ nhận lại bất kỳ thứ gì.

Chỉnh sửa thêm cho rõ ràng: Câu hỏi ban đầu của tôi dựa trên một sai lầm, vì tôi chưa đặt công cụ Nhà phát triển của mình để ghi lỗi vào bảng điều khiển. Hai lệnh trên (nhưng không gọi đến addEventListener) ĐỪNG ném lỗi trong trình duyệt, vì câu trả lời và nhận xét bên dưới cho biết.

+0

Không xác định không phải là một loại, nó không xác định. – T4rk1n

+0

Tôi biết rằng 'undefined' không phải là một loại. Câu hỏi của tôi là về trạng thái của 'undefined()', điều này không làm tăng lỗi cú pháp trong JavaScript. –

+0

Nó _is_ lạ-- nếu bạn chỉ cố gắng gọi undefined như là một chức năng trong giao diện điều khiển nó ném một lỗi, nhưng nếu tôi vượt qua bất kỳ không có chức năng như gọi lại vào 'addEventListener' nó chỉ âm thầm không có lỗi ... –

Trả lời

2

It's as if JavaScript is willing to invoke undefined .

Không, addEventListener is specified to ignore null, which JavaScript’s undefined is converted to. undefined không bao giờ được gọi.

bằng chứng hơn nữa rằng JavaScript là không sẵn sàng để gọi undefined, trong một trình duyệt:

> undefined() 
Uncaught TypeError: undefined is not a function 
    at <anonymous>:1:1 
+1

Tôi nghĩ rằng theo đúng hướng, nhưng có vẻ như có lẽ các trình duyệt đã đi trên và vượt ra ngoài spec, bởi vì tôi có thể làm điều đó với các chức năng khác-- như ' document.addEventListener ('click', 3) '- trình duyệt không phàn nàn nó đã được thông qua một chức năng không, nhưng khi tôi sau đó bấm vào tài liệu nó không gây ra bất kỳ loại lỗi nào ... –

+0

Có, có lẽ nó chỉ là những gì các trình duyệt được khoan dung. Tôi vừa thử 'console.log (undefined())' trong Node và nhận "Error Reference: undefined không phải là một hàm." –

+0

@AlexanderNied: Ah, đó là một điều Chrome. Firefox chỉ bỏ qua 'null' và' undefined'. – Ryan

0

Nó sẽ trở lại:

Undefined is not a function

console.log(typeof undefined());

Nếu bạn chạy nó trên một trình duyệt, nó sẽ trả về undefine d không phải là một hàm. Không xác định không có bất kỳ giá trị nào không giống như null là một đối tượng.

+0

Có, trong Nút, nhưng không có trong trình duyệt của tôi. Xem bình luận để trả lời dưới đây. Tôi nghĩ rằng chúng tôi đã ghim nó xuống như nói một cách nghiêm chỉnh một lỗi mà các trình duyệt chịu đựng. –

+1

@HomerWhite: 'undefined()' chắc chắn sẽ ném một lỗi trong trình duyệt của bạn. Bạn có thể không tìm kiếm lỗi ở đúng vị trí…? – Ryan

+1

Tôi khuyên bạn nên thay đổi đoạn mã thành 'undefined()' để rõ ràng. Một số có thể hiểu lầm rằng phần còn lại của bối cảnh không có liên quan. –

0

null có nghĩa là có điều gì đó tồn tại, nhưng đã được thông báo rằng nó không có giá trị. undefined có nghĩa là mọi thứ chưa được đưa ra giá trị, thường là vì nó chưa được khai báo/khởi tạo.

Trong Javascript, undefined là nguyên thủy. Đó là falsey, vì vậy nó đánh giá là False nếu được sử dụng trong điều kiện.

Javascript không phải là ngôn ngữ được nhập mạnh, vì vậy không có gì để kiểm tra xem hàm gọi lại một hàm cho đến khi được gọi. Trong thực tế Javascript không quan tâm có bao nhiêu đối số được truyền hoặc loại của chúng là gì, mọi thứ chỉ được đổ vào khi một hàm được gọi, và nó phụ thuộc vào hàm làm thế nào để xử lý các đối số.

Ví dụ: trong nhiều phương pháp đếm được, chúng trả lại cho bạn (index, value, array). Việc chức năng của bạn có tìm kiếm các giá trị này hoặc gán cho chúng một biến tạm thời không quan trọng, chúng vẫn được chuyển. Cả hai a.forEach(function(index){}) and a.forEach(function(){}) thực sự có quyền truy cập vào tất cả 3 của các biến được đề cập.

+1

* “Javascript không phải là một ngôn ngữ được đánh máy, vì vậy không có gì để kiểm tra xem hàm gọi lại có phải là một hàm hay không.” * Làm thế nào về 'typeof'? Dù sao, nếu bạn đã cố gắng gọi một chức năng không * mà không cần * kiểm tra, nó sẽ ném một lỗi, không thất bại âm thầm. – Ryan

0

Bạn có thể làm một cái gì đó như thế này để tìm ra loại đối số được truyền:

var myVar; 

Object.prototype.toString.call(myVar); 

và nó sẽ trở lại "[object Undefined]"

tương tự cho trường hợp sử dụng khác như thế nào nếu myVar là một chuỗi như sau:

var myVar = 'It is a string'; 
Object.prototype.toString.call(myVar); 

nó sẽ truy xuất "[object String]"

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