2010-04-16 24 views
5

Gọi toString() trên hàm bên dưới trả về các chuỗi khác nhau trên các trình duyệt. Tôi hiểu điều này là bởi vì ECMA-262 15.3.4.2 để lại khoảng trống cho mỗi nhà cung cấp.JavaScript sử dụng toString trên đối tượng Hàm để đọc nội dung văn bản

Chrome trả về nhận xét ngoài tất cả cú pháp. Đáng buồn thay, Firefox 3.6 bỏ qua các bình luận. Dựa trên hành vi của Firefox, tôi chưa thử nghiệm IE, Opera hoặc Safari.

function foo() { 
    /* comment */ 
    var bar = true; 
} 

Cụ thể, tôi đang cố gắng nhúng dữ liệu meta trong khối nhận xét được định dạng đặc biệt trong một hàm. Sau đó, giá trị trả về của hàm toString() sẽ được phân tích cú pháp và các giá trị được trả về dưới dạng một đối tượng.

Tôi không thể định vị các bảng tương thích hoặc các lựa chọn thay thế cho toString(). Cộng đồng có ý tưởng gì không? Các tệp JS, tiền xử lý JS không phải là một tùy chọn. :(

Cảm ơn rất nhiều. :)

Trả lời

1

Mặc dù không phải là trực tiếp như nhúng ý kiến, kể từ khi chức năng là đối tượng hạng nhất trong JS, bạn có thể chỉ định các thuộc tính tùy ý cho họ. Ví dụ:

> function f(x) { return x * x; } 
undefined 
> f 
function f(x) { return x * x; } 
> f.comment = 'Hello' 
Hello 
> f.comment 
Hello 

Bằng cách này bạn có thể nhúng siêu dữ liệu vào các đối tượng chức năng một cách sạch sẽ và có thể di chuyển.

1

Gần đây tôi đã cố gắng trả lời câu hỏi này và đã xem xét vấn đề này. Để cung cấp một bản cập nhật, tôi vẫn không thể tìm thấy một bảng tính tương thích, vì vậy tôi đã tạo ra fiddle sau:

https://jsfiddle.net/deamvp7r/

if((function(){ /*test*/ }).toString().match('test').length === 0) { 
    alert ("NO SUPPORT"); 
} else { 
    alert ("SUPPORTED"); 
} 

và thử nghiệm nó bằng tay trên BrowserStack. Đối với những gì nó có giá trị, sau đây là các trình duyệt tôi đã thử nghiệm và những gì tôi đã tìm thấy cho đến nay như xa như hỗ trợ comment trong Function.toString():

  • IE8 - 11: Hỗ trợ comments
  • Firefox < = 16: KHÔNG SUPPORT
  • Firefox> = 17: Hỗ trợ comments
  • Chrome 14 +: Hỗ trợ comments
  • trình duyệt
  • IOS iPhone 3GS +: Hỗ trợ comments
  • iPad 1 +: Hỗ trợ comments
  • Android 2.3 (Galaxy) +: Hỗ trợ Nhận xét

Danh sách này rõ ràng là không đầy đủ, vì vậy hãy cẩn thận nếu bạn phải hỗ trợ các trình duyệt cũ hơn/ít người biết đến hơn. Nhưng phần trăm các trình duyệt phổ biến hỗ trợ nhận xét hiện có vẻ khá cao.

0

Tính năng "chú thích" là giải pháp tốt cho những gì bạn có vẻ đang cố gắng thực hiện. Hiện tại, nó được thực hiện ở Traceur (xem here).Chú thích sử dụng @ cú pháp như sau:

@Anno('foo') 
function func() {} 

Về cơ bản đây là tương đương với

function func() {} 
func.annotate = [ new Anno('foo') ]; 

chú thích cũng có thể được đặt trên lớp ES6.

Ngay cả khi bạn không thể hoặc không muốn sử dụng cú pháp chú thích mới, các chức năng trang trí với các thuộc tính chứa siêu dữ liệu của chúng có vẻ tốt hơn là nhúng siêu dữ liệu đó vào nội dung chức năng, cho dù là nhận xét hay cách khác (một ý tưởng là một cái gì đó tương tự như "use strict"), và sau đó cố gắng giải nén nó bằng cách sử dụng thao tác chuỗi.

Tính năng chú thích vẫn đang trong giai đoạn thảo luận và có các đề xuất song song cho các biến thể được gọi là "trang trí" vv. Như bạn đã biết, bản thân khái niệm không phải là mới và được tìm thấy bằng các ngôn ngữ khác như Python, Java , và C#. Chú thích đang được xem xét để đưa vào các hương vị ngôn ngữ bao gồm AtScript, TypeScript và ES7.

Xem thêm JavaScript annotations. Để biết cách tiếp cận dựa trên phân tích cú pháp, hãy xem http://ariya.ofilabs.com/2014/04/tracking-javascript-annotations.html.

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