2010-06-22 26 views
9

Với một cái gì đó giống nhưLý do đằng sau một phân tích lỗi JavaScript trong MSIE 8

var obj = { 
    foo: function(){ 
     try{ 
      doSomething(); 
      }catch(ex){ 
       //@TODO - report error 
      } 
    } 
} 

MSIE 8 sẽ ném lên một "Thiếu dấu chấm phẩy trên dòng #" đó là nơi @TODO là.

Sau khi tôi quyến rũ hàng tá TODO của TODO! TODO, MSIE đã có thể phân tích cú pháp kịch bản và cuộc sống đã diễn ra đúng cách. Tôi có thiếu cái gì ở đây không, MSIE có sử dụng một số loại cơ chế phi tiêu chuẩn như // @ PRAGMA không?

Googling cho @TODO hoặc // @ không đưa ra bất kỳ điều gì hữu ích.

+0

Không xảy ra trên bản sao IE8 của tôi. –

+0

T.J. Crowder: Nó sẽ nếu bạn đặt '/ * @ cc_on @ * /' phía trên mã. –

+0

Tôi đã có một suy nghĩ ngày hôm qua. Nếu cờ này được bắt đầu bởi javascript và vẫn hoạt động cho phạm vi TOÀN BỘ; điều đó có nghĩa là cho một trang wordpress với hàng chục kịch bản của bên thứ ba, một kịch bản có thể khởi tạo nó và tất cả các tập lệnh sẽ bị hút vào cùng một hành vi .... wow. – David

Trả lời

9

Điều này liên quan đến việc biên dịch có điều kiện, một phát minh chỉ dành cho trình soạn thảo JScript (tên của IE cho hương vị của ECMAScript) dựa trên thông tin về trình duyệt và môi trường. Cú pháp liên quan đến biểu tượng @ theo sau là một chuỗi để tạo thành một biến, chỉ thị hoặc câu lệnh. Trong trường hợp này, sự hiện diện của @TODO ngay sau khi bắt đầu nhận xét làm cho văn bản nhận xét được hiểu là câu lệnh biên dịch có điều kiện, với @TODO là biến biên dịch có điều kiện (với giá trị NaN: xem http://msdn.microsoft.com/en-us/library/k0h7dyd7%28v=VS.80%29.aspx).

Các câu lệnh biên dịch có điều kiện thường được chứa trong các nhận xét JavaScript: chúng có để ngăn các trình duyệt khác cố gắng giải thích mã nhưng thực tế không bắt buộc phải kích hoạt biên dịch có điều kiện. Các tài liệu MSDN là ở đây:

http://msdn.microsoft.com/en-us/library/ahx1z4fs%28v=VS.80%29.aspx

Tính năng này chỉ được kích hoạt cho mã xuất hiện sau khi biên soạn có điều kiện được kích hoạt, mà là đạt được với

/*@cc_on @*/ 

Do đó, nếu bạn có thể tìm dòng này và loại bỏ sau đó, //@TODO - report error của bạn sẽ vẫn hoạt động bình thường. Tuy nhiên, một số mã của bạn có thể dựa vào việc biên dịch có điều kiện nên đây có thể không phải là một tùy chọn. Một cách giải quyết là để chèn một khoảng trống giữa đầu của bình luận (hoặc // hoặc /*) và @ biểu tượng:

// @TODO - report error 

tài liệu của Microsoft là không đủ rõ ràng để biết lý do tại sao các công trình này, vì các biến biên soạn có điều kiện cũng làm việc bên ngoài nhận xét:

// The following works in IE: 

/*@cc_on @*/ 
var j = @_jscript_build; 
alert(j); 

Vì vậy, tùy chọn an toàn nhất là tránh sử dụng @TODO hoàn toàn.

+0

Thật không may là công cụ của tôi chỉ là một phần nhỏ của tổng chi phí trong các phụ thuộc JS, như 100 LOC đến tổng số 120-140K LOC được gửi với mọi bố cục HTML đơn. – David

+0

Sửa đổi sau khi nghiên cứu thêm. –

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