2009-03-20 11 views
43

Tôi đã thấy một số người sử dụng toán tử void trong mã của họ. Tôi cũng đã thấy điều này trong các thuộc tính href: javascript:void(0) có vẻ không tốt hơn javascript:;Điểm của toán tử void trong JavaScript là gì?

Vì vậy, biện minh cho việc sử dụng toán tử void là gì?

+3

void là toán tử không trả về gì sau khi đánh giá biểu thức đã cho, bạn không cần sử dụng "(" và ")" để làm cho nó hoạt động. – Cleiton

+0

sizeof giống nhau trong C - nhưng mã đó rõ ràng hơn nhiều nếu dấu ngoặc đơn được sử dụng. – olliej

+0

'void' được sử dụng không thường xuyên. Trong ES5 nó được coi là lỗi thời. Sau khi đánh giá toán hạng của nó, nó trả về 'undefined' – jjpcondor

Trả lời

46

Explanation of its use in links:

<snip>

Đây là lý do mà bookmarklets thường quấn mã bên void() hoặc một chức năng vô danh mà không trở lại bất cứ điều gì để ngăn chặn các trình duyệt từ cố gắng hiển thị kết quả của thi hành bookmarklet. Đối với dụ:

javascript:void(window.open("dom_spy.html")) 

Nếu bạn trực tiếp sử dụng mã trả về cái gì đó (một trường hợp cửa sổ mới trong trường hợp này), trình duyệt sẽ kết thúc hiển thị rằng:

javascript:window.open("dom_spy.html"); 

Trong Firefox ở trên sẽ hiển thị:

[object Window] 

</snip>

+0

Xem thêm [void operator MDN docs] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void). –

10

xem xét như sau:

<a href="javascript:void(fish=document.getElementById('foo').value);void(document.getElementById('bar').value=fish);">With Void</a> 

<a href="javascript:fish=document.getElementById('foo').value;document.getElementById('bar').value=fish;">Without Void</a> 

<input type="text" id="foo" value="one fish" /> 
<input type="text" id="bar" value="no fish" /> 

Các liên kết đầu tiên sẽ trao đổi các giá trị của các trường văn bản. Liên kết thứ hai sẽ mở một trang mới với văn bản "một con cá". Nếu bạn sử dụng javascript: link, phút biểu thức trả về một cái gì đó khác với null hoặc undefined, trình duyệt sẽ hiểu đó là những gì liên kết nên thực hiện. Bằng cách gói tất cả các biểu thức/số liệu trong một hàm void(), bạn đảm bảo toàn bộ đoạn mã của mình sẽ chạy. Những ngày này, điều này chủ yếu được sử dụng trong Bookmarklets, như sử dụng một thuộc tính onclick, hoặc thiết lập xử lý sự kiện trong các khối/tệp Javascript riêng biệt là "tiêu chuẩn".

Đối với javascript:javascript:void(), câu đầu tiên không rõ ràng. Bạn đang nói, "này, tôi muốn chạy một số javascript", nhưng sau đó bạn không cung cấp bất kỳ mã nào. Nó không nhất thiết phải rõ ràng trình duyệt nên làm gì ở đây. Với câu lệnh thứ hai bạn đang nói "này, chạy một số javascript" và mã của bạn cuối cùng trả về không xác định, mà trình duyệt biết nghĩa là "không làm gì cả".

Vì tôi ở đây, tôi cũng sẽ chỉ ra rằng việc sử dụng javascript: hoặc javascript:void(); đã không còn phù hợp với hầu hết những người quan tâm đến đánh dấu. Điều tốt hơn để làm là để trình xử lý onclick của bạn trả về false và có liên kết trỏ tới trang/tài nguyên có ý nghĩa đối với những người đã tắt javascript hoặc đang sử dụng trình chặn javascript chẳng hạn như NoScript.

+0

Tác giả câu hỏi đã viết "javascript :;", không phải là "javascript:". Vì vậy, nó sẽ không được mơ hồ trong trường hợp đó, phải không? –

+0

Có bất kỳ câu lệnh trống nào trả về false hoặc trả về true, cho biết câu lệnh đã chạy thành công không? –

+1

Tại sao một câu lệnh trống sẽ trả về một cái gì đó? –

4

Giá trị undefined không thể truy cập trực tiếp trong JavaScript cho đến ES1.3.

Vì vậy, nhà điều hành void <expression> do đó được cho phép truy cập vào giá trị này.

Đôi khi nó hữu ích, đặc biệt khi làm việc với API Web (ví dụ: xử lý sự kiện), để đảm bảo rằng kết quả của biểu thức là nhất quán undefined.

Khi thuộc tính undefined được thêm vào đối tượng chung trong ES1.3, tiện ích của void trở nên không rõ ràng.

Do đó, câu hỏi của bạn.

+0

Downvoter, vui lòng giải thích? – Ben