javascript
2013-08-14 40 views 26 likes 
26

Đây là jsfiddleHàm Javascript không trả về đối tượng khi có ngắt dòng giữa câu lệnh trả về và đối tượng?

Mã đầy đủ:

function foo1(){ 
    return {msg: "hello1"}; 
} 
function foo2(){ 
    return 
    {msg: "hello2"}; 
} 

// output = "foo1 = {"msg":"hello1"}" 
console.log('foo1 = ' , JSON.stringify(foo1())); 

//output = " foo2 = undefined " 
console.log('foo2 = ' , JSON.stringify(foo2())); 

Sự khác biệt giữa hai là trong foo2, các {msg: 'hello'} là phù hợp mới của riêng mình. Tôi đã mong đợi trình phân tích cú pháp bỏ qua khoảng trắng?

+2

không có câu lệnh trả về Tôi tin rằng, tôi nhớ đã đọc nó ở đâu đó rằng đây là một trong những trường hợp hiếm hoi trong JS mà khoảng trắng không quan trọng. Có thể trùng lặp http://stackoverflow.com/questions/8528557/a-return-statement-in-javascript-does-not-work-properly-if-the-return-value-is – OJay

+0

Kiểm tra liên kết này: http: // robertnyman.com/2008/10/16/beware-of-javascript-semicolon-insertion/ –

+0

Một số khoảng trắng nhất định. Bất kỳ số không gian ASCII bình thường nào đều tốt, trong khi không cho phép một LF/CR đơn lẻ. Có vẻ tùy ý, nhưng tôi sẽ giả sử có một lời giải thích hợp lý cho lý do tại sao tôi bị mất một giờ về vấn đề này đêm qua. Thông báo lỗi của linter có thể chính xác/hữu ích hơn. – sss4r

Trả lời

22

Ngắt dòng đang gây ra 'không xác định' trong hàm thứ hai. JavaScript không yêu cầu dấu chấm phẩy trong nhiều trường hợp và chỉ giả định chúng trong các ngữ cảnh nhất định.

+1

Như một quy tắc tốt ... luôn giữ câu lệnh trả về trên một dòng trong JavaScript. – scunliffe

+0

Để làm cho vấn đề trở nên tồi tệ hơn, có sự phân tích cú pháp sự khác biệt giữa cách thức Chrome/Firefox giải thích phần cuối của dòng và cách IE giải thích vấn đề của nó. –

+5

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

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