2010-04-16 17 views
5

在下面的函數中調用toString()會在瀏覽器中返回不同的字符串。我理解這是因爲ECMA-262 15.3.4.2爲每個供應商留下了擺動空間。在函數對象上使用toString來讀取文本內容的JavaScript

除了所有語法之外,Chrome還返回註釋。可惜Firefox 3.6忽略了這些評論。基於Firefox的行爲,我還沒有測試IE,Opera或Safari。

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

具體來說,我試圖將元數據嵌入到函數中特殊格式的註釋塊中。稍後,函數toString()方法的返回值將被解析並返回值作爲對象。

我一直無法找到兼容性表或替代的toString()。社區有什麼想法嗎?順便說一句,預處理JS文件不是一個選項。 :(

感謝。:)

回答

1

雖然沒有直接的嵌入註釋,因爲函數是在JS第一類對象,你可以爲他們指定任意屬性。例如:

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

通過這種方式,您可以將元數據完整且便攜地嵌入到函數對象中。

1

我試圖最近回答這個問題,並跨越這來了。爲了提供更新,我仍然無法找到一個兼容性列表,所以我創建了以下小提琴:

https://jsfiddle.net/deamvp7r/

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

和手動測試了BrowserStack。對於它的價值,這裏是我測試過的瀏覽器,什麼我在Function.toString()只要迄今發現的評論支持:

  • IE8 - 11:支持意見
  • 火狐< = 16:NO SUPPORT
  • 火狐> = 17:支持評論
  • 鉻14 +:支持評論
  • IOS iPhone 3GS瀏覽器+:支持評論
  • ipad公司1 +:支持評論
  • 的Android 2.3(銀河)+:支持評論

這個列表是詳盡顯然遠遠,所以要小心,如果你有支持老/更隱蔽的瀏覽器呢。但目前支持評論的流行瀏覽器的比例似乎相當高。

0

的「註釋」功能對你彷彿可以嘗試做一個很好的解決方案。目前,它在Traceur中實施(見here)。註釋使用@語法如下:

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

本質上講,這相當於

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

註釋也可以在ES6類放。

即使您不能或不想使用新的註釋語法,帶有屬性的裝飾函數來包含它們的元數據看起來好於將這樣的元數據嵌入到函數體中,不管是作爲註釋還是以其他方式一個想法類似於"use strict"),然後嘗試使用字符串操作來提取它。

註解特性仍處於討論階段,並且有針對稱爲「裝飾器」的變體的並行提議等。您可能知道,概念本身並不新鮮,並且可以在其他語言中找到,例如Python,Java ,和C#。正在考慮將註釋納入語言風格,包括AtScript,TypeScript和ES7。請參閱JavaScript annotations。對於基於分析的方法,請參閱http://ariya.ofilabs.com/2014/04/tracking-javascript-annotations.html

相關問題