<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Dec 12, 2009, at 11:08 AM, Mark S. Miller wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">On Sat, Dec 12, 2009 at 10:53 AM, Mike Samuel <span dir="ltr">&lt;<a href="mailto:mikesamuel@gmail.com">mikesamuel@gmail.com</a>&gt;</span> wrote:<div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
On the interaction of Function.prototype.toString and function<br>
proxies, one use case is code that tries to get at a function's name<br>
as by doing<br>
<br>
function nameOf(f) {<br>
 &nbsp;if ('name' in f) { return <a href="http://f.name/" target="_blank">f.name</a>; } &nbsp;// Works on some interpreters<br>
 &nbsp;var m = ('' + f).match(/^function\s+([^(\s]+)/);<br>
 &nbsp;return m ? m[1] : void 0;<br>
}<br>
<br>
I'm not sure how much of the existing code like this invokes toString<br>
directly or indirectly instead of using Function.prototype.toString.<br>
<br>
Function proxy handlers could implement has('name') then there might<br>
not be a need for Function.prototype.toString to support this use<br>
case.<br>
<div><div class="h5"><br></div></div></blockquote><div><br></div><div>Under the current proposal, a trapping function proxy f can virtualize all the following without problem:</div><div><br></div><div>&nbsp;&nbsp; &nbsp;'name' in f</div>
<div>&nbsp;&nbsp; &nbsp;<a href="http://f.name/">f.name</a></div><div>&nbsp;&nbsp; &nbsp;'' + f</div><div>&nbsp;&nbsp; &nbsp;f.toString()</div><div><br></div><div>The only open issue is</div><div><br></div><div>&nbsp;&nbsp; &nbsp;Function.prototype.toString.call(f)</div></div>
<br>I would have ventured a guess that this isn't used in real code. But having learned my lesson ;), I looked. What do we all think of&nbsp;&lt;<a href="http://www.google.com/codesearch?hl=en&amp;lr=&amp;q=Function.prototype.toString.call+lang:javascript&amp;sbtn=Search">http://www.google.com/codesearch?hl=en&amp;lr=&amp;q=Function.prototype.toString.call+lang:javascript&amp;sbtn=Search</a>&gt;?</blockquote></div><br><div>Interesting. A few of these uses appear to be in JavaScript libraries so they could be widespread. I see a few different uses:</div><div><br></div><div>- To get the function name</div><div>- To detect if something is a function at all (by seeing if the attempt to call it throws)</div><div>- To&nbsp;check for function equality (likely a bogus check!)</div><div>- To get argument names</div><div>- Something else mysterious that I couldn't figure out (looking for calls to the Function constructor inside the function body?)</div><div><br></div><div>Note though that in the case of DOM emulation specifically, probably most of these are not relevant. Looking at toString() on DOM methods is usually done for one of the following reasons:</div><div><br></div><div>1) To get the function name.</div><div>2) To check for "[native code]" to verify that a native method hasn't been replaced by JavaScript code (seems like a fairly bogus check).</div><div><br></div><div>Regards,</div><div>Maciej</div><div><br></div><div><br></div></body></html>