Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JavaScript using toString on a Function object to read text content

Calling toString() on the function below returns different strings across browsers. I understand this is because ECMA-262 15.3.4.2 leaves wiggle room for each vendor.

Chrome returns the comments in addition to all syntax. Sadly Firefox 3.6 omits the comments. Based on Firefox's behavior I haven't tested IE, Opera, or Safari.

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

Specifically, I am attempting to embed meta data within a specially formatted comment block within a function. Later the return value of the functions toString() method would be parsed and values returned as an object.

I've been unable to locate compatibility tables or alternatives to toString(). Does the community have any ideas? Btw, pre-processing JS files isn't an option. :(

Thanks a lot. :)

like image 756
mseeley Avatar asked Nov 05 '22 14:11

mseeley


2 Answers

Although not as direct as embedding comments, since functions are first-class objects in JS, you can specify arbitrary properties for them. E.g.:

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

This way you can embed metadata into function objects cleanly and portably.

like image 85
Max Shawabkeh Avatar answered Nov 12 '22 15:11

Max Shawabkeh


I was trying to answer this question recently, and came across this. To provide an update, I was still unable to find a compatibility table, so I created the following fiddle:

https://jsfiddle.net/deamvp7r/

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

and tested it manually on BrowserStack. For what it's worth, here are the browsers I've tested and what I've found so far as far as comment support in Function.toString():

  • IE8 - 11 : Supports comments
  • Firefox <= 16 : NO SUPPORT
  • Firefox >= 17 : Supports comments
  • Chrome 14 + : Supports comments
  • IOS iPhone 3GS browser + : Supports comments
  • iPad 1 + : Supports Comments
  • Android 2.3 (Galaxy) + : Supports Comments

This list is clearly far from exhaustive, so be careful if you have to support older/more obscure browsers yet. But the percentage of popular browsers that support comments currently seems pretty high.

like image 45
zero Avatar answered Nov 12 '22 16:11

zero