2012-03-30 32 views
5

Điều gì trên thế giới đang làm cho tham số thứ hai trở về true?Tại sao vòng lặp 'cho (;;)' này lại là?

CẢNH BÁO: nó sẽ lặp vô hạn và có thể sụp đổ trình duyệt của bạn

for(;;){ 
    //... 
} 

Tôi đã hoàn toàn hy vọng không để lặp ở tất cả ...

Nhưng nó đang chạy, và điều đó làm cho nó tồi tệ hơn vì nó chỉ có thể chạy nếu một cái gì đó được đánh giá là true, hay tôi đang thiếu cái gì đó?

+3

Nếu hoàn toàn không có điều kiện, vòng lặp for sẽ chạy cho đến khi bạn thoát ra khỏi nó. Nó giống nhau trong C. –

+0

Xem http://stackoverflow.com/questions/4894120/special-for-loop-syntax/4894256#4894256 - chỉ giống nhau trong Java và JavaScript giống như trong C và C++. – paxdiablo

Trả lời

7

Từ forMDN

for ([initialization]; [condition]; [final-expression]) 
    statement 

[Initialization][final-expression] được bằng trực giác không cần thiết, giảm cấu trúc để một while vòng lặp đơn giản. Nhưng phần có liên quan là:

trạng
Một biểu thức để được đánh giá trước mỗi lần lặp. Nếu biểu thức này đánh giá đúng, câu lệnh được thực hiện. Thử nghiệm có điều kiện này là tùy chọn. Nếu bỏ qua, điều kiện luôn luôn đánh giá là đúng. Nếu biểu thức đánh giá sai, thực thi sẽ bỏ qua đến biểu thức đầu tiên sau cấu trúc.

(tôi nhấn mạnh)

này dường như là một JS quyết định thiết kế ngôn ngữ hoàn toàn tùy ý. Nếu đó là ngôn ngữ của tôi, tôi có lẽ sẽ ném một lỗi cú pháp.


Trên một mặt lưu ý vui tươi, for(;;){} tương đương với while(true){}, và sẽ xảy ra là 4 ký tự ngắn hơn. Tôi tự hỏi, nếu bộ khai thác tận dụng điều này!

+0

tham khảo tốt, tôi hoàn toàn tin tưởng vào mọi từ của trang web đó – ajax333221

4

Do thiếu điều kiện sẽ luôn được đánh giá là đúng.

+0

Thật sao? Đó là loại hokey. Đó có phải là cách nó hoạt động ở mọi nơi trong Java không? Như trong 'if()'? –

+0

@RobertHarvey, cú pháp ngăn chặn 'if()' không có điều kiện, nhưng nó không ngăn chặn 'for()'. – rid

1

Không có gì "làm cho tham số thứ hai trả lại true". Không có tham số thứ hai. Mục 12.6.3 của số ECMAScript Language Specification (ECMA-262 5th Edition) nói điều này:

a. Nếu hiển thị Biểu thức hiện tại, sau đó

i. Hãy để testExprRef là kết quả của việc đánh giá Biểu thức đầu tiên.

ii. Nếu GetValue (testExprRef) là sai, return (normal, V, empty).

Các “Biểu hiện đầu tiên” nó đề cập đến là sự biểu hiện tùy chọn giữa phẩy của báo cáo kết quả for. Nếu có, chương trình sẽ thực hiện các bước (i) và (ii) được trích dẫn ở trên. Nếu biểu thức không có, chương trình không thực hiện các bước (i) và (ii) của thuật toán câu lệnh for.

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