arguments.callee in Harmony

Brendan Eich brendan at mozilla.com
Fri Sep 25 14:28:36 PDT 2009


On Sep 25, 2009, at 2:24 PM, Charles Jolley wrote:

>> But we can hear feedback, esp. on this list, about hardship  
>> adopting strict mode in early ES5 implementations. Mozilla's will  
>> be done shortly, and it sounds like WebKit's is coming along  
>> quickly too. Feedback based on two interoperable implementations in  
>> developers' hands before the ES5 spec is stamped done would have  
>> been best. But real-code/real-world feedback better late than never  
>> is welcome.
>
> Once an implementation is out to play with you can be sure I will  
> try to build SproutCore with ES5 in strict mode and report back!
>
> But just to be clear, after all of the discussion here, it appears  
> that the only way to implement a "call super" pattern in ES5  
> (without resorting to closures as Breton suggested) would be to use  
> the following magic phrase everywhere I want to invoke super:
>
> var IS_ES5_STRICT = /** detect ES5 strict mode somehow */

var IS_ES5_STRICT = typeof function(){return this;}() == "undefined";

or a variation (Mark Miller hat tip).


> ClassB = ClassA.extend({
>  foo: function method() {
>    (IS_ES5_STRICT ? method : arguments.callee).base.apply(this,  
> arguments);
>  }
> });

But why wouldn't you use method always? Or callee, as Ollie suggested.  
Agree it's annoying to have to add six letters of cruft after the  
function keyword (with space separator) but once you do that, provided  
you dodge IE bugs, why do you need arguments.callee at all?


> PS. Is there an official way to detect that I am running code in ES5  
> strict mode?  I can't find it in the spec.

if (! function () {return this;}()) { /* in strict mode */ }

is IIRC a shorter way, relying on falsy-ness of undefined, to test.

/be



More information about the es-discuss mailing list