2011-05-29 24 views
14

Từ mã phân tích theo dõi google:javascript: đây có phải là bài tập có điều kiện không?

var _gaq = _gaq || []; 

như thế nào công việc này?

Đây có phải là bài tập có giá trị biến điều kiện không? Có giống như nói:

if(!(_gaq)) {_gaq = []; } 

?

+0

bản sao có thể có của [Cái gì || operator?] (http://stackoverflow.com/questions/830618/what-does-the-operator-do) –

+0

Câu trả lời ngắn gọn: có (mặc dù câu lệnh thứ hai tạo ra một '_gaq' * chỉnh sửa toàn cục *: nếu chúng ta giả sử '_gaq' không tồn tại). –

+0

@Felix - trừ khi có điều gì khác áp dụng một phạm vi khác cho '_gaq' – Quentin

Trả lời

15

Toán tử hoặc toán tử (||) sẽ trả về phía bên trái nếu nó là giá trị thực, nếu không nó sẽ trả về phía bên tay phải.

Nó rất giống với ví dụ thứ hai của bạn, nhưng vì nó sử dụng từ khóa var, nó cũng thiết lập phạm vi cục bộ cho biến.

5

Vâng, đúng vậy.

Toán tử || đánh giá toán hạng "chân thực" bên trái của nó.
Nếu _gaq là "falsy" (chẳng hạn như null, undefined hoặc 0), nó sẽ đánh giá ở bên phải ([]).

+3

hoặc 'false' hoặc' "" '(chuỗi trống) –

+0

+1 vì tôi thích mô tả của bạn –

1

Trên thực tế nó là không giống như nói:

if (!_gaq) _gaq = []; 

ít nhất là không nhất thiết. Xem xét việc này:

function outer() { 
    var _gaq = null; 
    function inner() { 
    var _gaq = _gaq || []; 
    // ... 
    } 

    inner(); 
    _gaq = 1; 
    inner(); 
} 

Khi có một "_gaq" (Tôi ghét gõ đó, bằng cách này) trong một phạm vi từ vựng bên ngoài, những gì bạn kết thúc với một mới biến trong phạm vi bên trong. Câu lệnh "if" khác với cách rất quan trọng — sẽ chỉ có một "_gaq" trong trường hợp đó.

2

Nó giống như nói:

if(!(_gaq)) {var _gaq = [];} 

(Điều này có thể được thực hiện kể từ khi var được kéo lên trên việc kiểm tra điều kiện, do đó tránh được một lỗi 'không xác định', và nó cũng sẽ gây _gaq là tự động được coi là địa phương trong phạm vi.)

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