14

Trong khi gỡ lỗi javascript được viết bởi người khác, tôi đã xem qua một số mã mà tôi chưa từng thấy trước đây. Dưới đây là một ví dụ:Kỹ thuật mã hóa JavaScript hoặc mã xấu?

function doSomething() { 
    //doing something here... 
} 

function doItNow() { 
    //other logic... 
    doSomething && doSomething(); // <=== What's this? 
} 

là mục đích của dòng thứ 2 trong chức năng doItNow() để kiểm tra xem doSomething tồn tại và sau đó gọi nó? Giống như vậy:

function doItNow() { 
    //other logic... 
    if (doSomething) { 
     doSomething(); 
    } 
} 

JSLint không thích và tôi không muốn có mã xấu trong ứng dụng của mình. Bất kỳ thông tin chi tiết nào?

+0

Tôi nghĩ nó khá thông minh mặc dù nó làm tổn thương khả năng đọc của mã. Tôi sẽ không gọi đây là "mã xấu" nhiều hơn "mã với khả năng đọc kém" –

+0

Tùy thuộc vào ngôn ngữ, điều này có thể được coi là một thành ngữ tiêu chuẩn. –

Trả lời

7

Thực sự là 'viết tắt'. Phía bên phải chỉ được thực hiện khi phía bên trái chuyển thành câu hỏi if().

Trình đóng gói của Google và các bộ khai thác khác tận dụng lợi thế này; nếu đầu vào của bạn là if(a) a(), nó sẽ gây ra a&&a()


Bạn có thể làm tương tự với ||, ví dụ:

if(!a){ 
    alert('Not a'); 
} 

có thể được viết như

a || alert('Not a'); 
+0

Cảm ơn, đó là phỏng đoán của tôi. – Silkster

6

Vâng, bạn hai ví dụ là "tương đương", toán tử && thực hiện short-circuit evaluation.

Nếu biểu thức toán hạng đầu tiên mang lại một giá trị falsey (như null, undefined, 0, NaN, một chuỗi rỗng, và tất nhiên false), khái niệm toán hạng thứ hai sẽ không được đánh giá, và nếu giá trị là sự thật, cuộc gọi chức năng sẽ được thực hiện.

Nhưng nếu doSomething chưa được khai báo, cả hai ví dụ của bạn sẽ không thành công.

Nếu một định danh đó là không khai báo, được giới thiệu trên mã, bạn sẽ nhận được một ngoại lệ ReferenceError, ví dụ:

function foo() { 
    undeclared && undeclared(); 
} 

try { 
    foo(); 
} catch (e) { 
    alert(e); // ReferenceError! 
} 

Nếu bạn muốn:

  1. Hãy chắc chắn rằng nhận dạng tồn tại, và
  2. Đảm bảo rằng nó là có thể gọi

Bạn có thể:

if (typeof doSomething == 'function') { 
    doSomething(); 
} 

Các typeof operator thể được sử dụng một cách an toàn trên định danh không tồn tại, thêm vào đó, bằng cách kiểm tra rằng doSomething là một chức năng, bạn hãy chắc chắn rằng bạn sẽ có thể để gọi nó.

+0

+1. Đây là câu trả lời hoàn chỉnh hơn câu trả lời được chấp nhận. –

+0

@Tim: Cảm ơn! :) – CMS

+0

@CMS, cảm ơn phản hồi. – Silkster

1

Chức năng gọi (hoặc nhiệm vụ, vv) so sánh thường là một ý tưởng tồi. Mọi người thường không mong đợi so sánh có tác dụng phụ.Trường hợp này đơn giản đến mức có thể là chính đáng, nhưng nếu ai đó không hiểu quy ước họ có thể phải hỏi trên StackOverflow;)

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