On Wednesday, June 28, 2017 at 2:21:16 PM UTC+2, Vassilis Virvilis wrote:
>
> I am not following the implementation details and I cannot judge on the 
> compromises front.
>
> But from a user standpoint this should be implemented because a 
> @JsFunction should generate a js function()  and a js function() happens to 
> have a length member by specification (see 
> https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/length
>  
> )
>
> Otherwise @JsFunction is not a js function() but something callable 
> instead.
>

GWT generates a function, but a function with an empty formal parameter 
list (and as a result a length of 0), because it simply uses 
'arguments': 
https://github.com/gwtproject/gwt/blob/2.8.1/dev/core/super/com/google/gwt/dev/jjs/intrinsic/com/google/gwt/lang/Runtime.java#L158-L169
 

> Given the dynamic number of javascript I expect that these kind of checks 
> to be common enough to warrant the effort.
>

One could argue the reverse: due to the dynamic nature of JS, 'length' of a 
function isn't reliable, and you'd be better off using distinct APIs rather 
than driving behavior by inferring things from inputs, or more precisely be 
explicit with your intent.
It easily fails you, as soon as you wrap a function to bind, curry, memoize 
it, whatever, using a generic factory (one that uses 'arguments' along with 
Function.prototype.apply or Function.prototype.call; one that specifically 
doesn't use Function.prototype.bind).
Have a look at the Function.prototype.bind polyfill from the MDN for 
example: 
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Polyfill
Any code targeting IE8 or older (that doesn't necessarily mean new code) 
would need this polyfill, and the returned function (fBound) has a length 
of 0, irrespective of the length of the function to bind.
There's a polyfill for Function.prototype.bind that returns a function with 
the correct 'length', but it uses new Function() with a string 
body: 
https://github.com/Raynos/function-bind/blob/83e639ff74e6cd6921285bccec22c1bcf72311bd/implementation.js#L38
 
so it'd break most CSP. While IE8 doesn't support CSP (so it's OK for this 
particular polyfill), that however means you cannot use such a trick for 
other things you'd like to do with a function (such as memoizing it: for 
example, https://github.com/caiogondim/fast-memoize.js returns a function 
with length 0 too).

-- 
You received this message because you are subscribed to the Google Groups "GWT 
Contributors" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/google-web-toolkit-contributors/e12e8c02-c6f0-4818-aaee-fb564935e8ec%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to