2010-10-01 37 views
50

Câu lệnh trả về bên trong khối try/catch hoạt động như thế nào?Javascript: try/catch/return return statement

function example() { 
    try { 
     return true; 
    } 
    finally { 
     return false; 
    } 
} 

Tôi hy vọng đầu ra của hàm này là "đúng", nhưng thay vào đó nó là "sai"!

+1

Văn bản câu hỏi và tiêu đề của bạn hỏi về 'try'/**' catch' **, nhưng mã của bạn sử dụng 'final'? – Bergi

Trả lời

53

Cuối cùng, luôn thực hiện. Đó là những gì nó cho, có nghĩa là nó trở lại được sử dụng trong trường hợp của bạn.

Bạn sẽ muốn thay đổi mã của bạn vì vậy nó nhiều như thế này:

function example() { 
    var returnState = false; // initialisation value is really up to the design 
    try { 
     returnState = true; 
    } 
    catch { 
     returnState = false; 
    } 
    finally { 
     return returnState; 
    } 
} 

Nói chung bạn không bao giờ muốn có tuyên bố nhiều hơn một trở lại trong một chức năng, mọi thứ như thế này là lý do tại sao.

+20

Tôi cho rằng có nhiều câu trả về không phải lúc nào cũng xấu - Xem http://stackoverflow.com/questions/36707/should-a-function-have -only-one-return-statement để thảo luận thêm. – Castrohenge

+3

+1 câu trả lời hay. không đồng ý về một trở lại trong một chức năng mặc dù. –

+3

Tôi cũng không đồng ý về quy tắc trả lại một lần. Bạn không bao giờ nên trở về từ cuối cùng, mặc dù (trong C#, nó thậm chí không được cho phép). – erikkallen

5

Khi bạn sử dụng finally, mọi mã trong khối đó sẽ kích hoạt trước khi thoát khỏi phương pháp. Bởi vì bạn đang sử dụng lợi nhuận trong khối finally, nó gọi số return false và ghi đè trước return true trong khối try.

(thuật ngữ có thể không hoàn toàn đúng.)

0

Theo như tôi biết, finally khối luôn thực thi, bất kể bạn có một tuyên bố return bên try hay không. Ergo, bạn nhận được giá trị trả về bởi câu lệnh return bên trong khối cuối cùng.

Tôi đã thử nghiệm điều này với Firefox 3.6.10 và Chrome 6.0.472.63 cả trong Ubuntu. Có thể mã này có thể hoạt động khác trong các trình duyệt khác.

3

lý do tại sao bạn nhận được sai là bạn đã quay trở lại trong một khối cuối cùng. cuối cùng khối nên thực thi luôn. nên return true của bạn thay đổi để return false

function example() { 
    try { 
     return true; 
    } 
    catch { 
     return false; 
    } 
} 
-1

Cuối cùng là vụ phải luôn luôn chạy ở phần cuối của một khối try catch để (theo đặc điểm kỹ thuật) là lý do tại sao bạn đang nhận sai trả lại. Hãy nhớ rằng hoàn toàn có thể là các trình duyệt khác nhau có các triển khai khác nhau.

+0

IE8, Firefox 3.6 và Chrome 6: tất cả đều giống nhau) – bonfo

20

Theo ECMA-262 (5ed, tháng 12 năm 2009), in pp 96:.

Việc sản xuất TryStatement : try Block Finally được đánh giá như sau:

  1. Hãy B là kết quả của việc đánh giá Block.
  2. Cho F là kết quả của việc đánh giá Cuối cùng.
  3. Nếu F.type là bình thường, trở về B.
  4. Return F.

Và từ trang 36:.

Loại Hoàn thành được sử dụng để giải thích hành vi của báo cáo (break, continue, returnthrow) thực hiện chuyển quyền kiểm soát không tập trung.Giá trị của các loại Hoàn là gấp ba dạng (chủng loại, giá trị, mục tiêu), nơi loại là một trong những normal, break, continue, return, hoặc throw, giá trị được bất kỳ giá trị ngôn ngữ ECMAScript hoặc trống rỗng, và mục tiêu là bất kỳ số nhận dạng ECMAScript nào hoặc trống.

Rõ ràng là return false sẽ thiết lập kiểu kết thúc cuối cùng như trở, gây try ... finally làm 4. Trở F.

+0

câu trả lời rõ ràng nhất tại đây –