2011-12-16 37 views
21

Hãy xem xét mã Javascript sau.Tại sao lệnh trả lại Javascript không hoạt động khi giá trị trả về nằm trên một dòng mới?

<script language="javascript" type="text/javascript"> 
     function correct() 
     { 
      return 15; 
     } 

     function wrong() 
     { 
      return 
        15; 
     } 

     alert("correct() called : "+correct()); 
     alert("wrong() called : "+wrong()); 

</script> 

Phương pháp correct() trong đoạn mã trên trả về giá trị đúng mà là trong trường hợp này. Phương thức wrong(), tuy nhiên trả về undefined. Như vậy không phải là trường hợp với hầu hết các ngôn ngữ khác.



Hàm ở phía dưới tuy nhiên chính xác và trả về giá trị đúng.

function wrong() 
{ 
    return(
      15); 
} 

Nếu cú ​​pháp là sai, cần ban hành một số lỗi biên dịch nhưng nó không. Lý do tại sao điều này xảy ra?

+4

bản sao có thể có của [Quy tắc chèn dấu chấm phẩy tự động của Javascript là gì?] (Http://stackoverflow.com/questions/2846283/what-are-the-rules-for-javascripts-automatic-semicolon-insertion) –

+1

Đây là một trong những lý do mà tôi đặt parens xung quanh giá trị trả lại của tôi. – jfriend00

+0

Kết quả là 15, không phải 10 như hiển thị. –

Trả lời

37

Về mặt kỹ thuật, dấu chấm phẩy trong javascript là tùy chọn. Nhưng trong thực tế nó chỉ chèn chúng cho bạn tại một số ký tự dòng mới nhất định nếu nó cho rằng chúng bị thiếu. Nhưng các descisions nó làm cho bạn hiếm khi những gì bạn thực sự muốn.

Và tuyên bố return theo sau bởi một dòng mới cho biết intepreter JS rằng dấu chấm phẩy nên được chèn sau đó return. Do đó, mã thực tế của bạn là:

function wrong() 
{ 
    return; 
      15; 
} 

Rõ ràng là sai. Vậy tại sao điều này lại hiệu quả?

function wrong() 
{ 
    return(
      15); 
} 

Ở đây chúng tôi bắt đầu một biểu thức với số mở (. JS biết chúng ta đang ở giữa một biểu thức khi nó tìm thấy dòng mới và đủ thông minh để không chèn bất kỳ dấu chấm phẩy nào trong trường hợp này.

+2

Không, dấu chấm phẩy là một phần chính thức của cú pháp và có ghi chú trong các sản phẩm cú pháp của ngôn ngữ có thể gợi ý rằng dấu chấm phẩy là tùy chọn. Nó chỉ là tiêu chuẩn xác định hành vi nếu chúng bị bỏ qua. Vì vậy, nó giống như một trường hợp đặc biệt ... nó giống như một add-on cho tiêu chuẩn. –

+1

Theo tùy chọn, tôi có nghĩa là tập lệnh có thể phân tích cú pháp mà không có chúng. Trái ngược với nhiều ngôn ngữ khác như C hoặc Java có lỗi khi biên dịch/đánh giá thời gian khi không có dấu chấm phẩy. Tôi đã không có nghĩa là để khuyến khích việc thiếu các dấu chấm phẩy trong javascript. Nếu thực tế, thì ngược lại. –

+1

Đó là từ "chính thức" làm phiền tôi. Việc bỏ qua được dung thứ, nhưng các dấu chấm phẩy * là * một phần của cú pháp - chính thức. –

1

Dòng lệnh của javascript không thể bị hỏng do ngắt dòng. Nhưng các đối số của các hàm có thể bị hỏng, không được khuyến khích cao (được thực hiện trong ví dụ của bạn).

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