Future proof "use strict";

Michael Schurter michael at susens-schurter.com
Fri May 22 16:22:49 PDT 2009


On Fri, 2009-05-22 at 15:26 -0700, Brendan Eich wrote:
> On May 22, 2009, at 2:54 PM, Michael Schurter wrote:
> 
> > Essentially my fear is that the meaning of "use strict" becomes
> > ambiguous when future versions of ECMAScript are released (6 and
> > beyond).
> 
> The Web doesn't rev just because a new edition of the standard comes  
> out. If only we could use CPython's deprecating/obsolescence/from  
> future import stuff. We can't, since old browsers persist for years  
> and only go away unpredictably down the road.
> 
> So "use strict" has to mean in future years what it meant in the first  
> year it appeared, absent explicit version selection.
> 
> You're right to note the possible version connection, but it is not  
> mandatory. Users can say
> 
> "use strict";
> 
> in content targeting ES5 and downrev browsers, but need not opt into  
> ES5 -- this is important for adoption. In other words, the above can  
> and should appear in a <script type="application/javascript"> or even  
> just <script> (no type attribute) tag. No RFC4329 ";version=..." MIME  
> type parameter need be supplied, and current browsers don't all follow  
> RFC4329 anyway.
> 
> With careful object detection and emulation (e.g., __lookupGetter__ as  
> a fallback if Object.getOwnPropertyDescriptor is not detected), or  
> just avoidance of new-in-ES5 features, the programmer nevertheless  
> benefits from strict mode checking in the uprev browsers used for  
> development and (some) testing.
> 
> 
> > What seems reasonable for both ES users (webdevs) and implementors is
> > for ES engines to support only 2 modes: strict and permissible,
> > supporting fine-grained per-ES-version language support would cause
> > undue complexity for implementors.
> 
> Yes, that's true.
> 
> 
> > However, when ES users enable the strict mode, they have a specific ES
> > version in mind (right now 5, but in the future perhaps 6, 5.1, etc).
> 
> If they do and the version changed strict mode -- which is possible,  
> we've talked about strict mode becoming stricter over time -- then  
> (and only then) will an explicit version selection pragma or MIME type  
> parameter be required.
> 
> But as with Perl, we hope that simple, version-free "use strict" will  
> suffice for a long time.
> 
> 
> > Based on the 2 reasonable modes model I describe above "strict ES v5"
> > should be evaluated in the *permissible* mode by future ES versions.
> 
> That's wildly optimistic. We have no idea when, if ever, a random  
> string literal expressed as a useless statement might be safely  
> interpreted to enable an incompatible mode of the language. It's  
> unlikely any such code exists, but it is overtly incompatible.
> 
> 
> > Therefore, ES users need a way to define an ES *version* to target.
> 
> Maybe, maybe not. We shouldn't assume this and over-couple "use  
> strict" and a "use version".

The above makes sense.  Thanks for the thorough and patient
explanation.  :-)

> > This could be as simple as:  "use strict 5"; which could even be used
> > alongside the current "use strict"; right now.
> >
> > A more robust model might be to allow the mode to be defined in a
> > conditional statement:
> >
> > if (ecmascript.version <= 5) "use strict";
> 
> The pragma is a compiler directive, a static property of code, and so  
> must come first in a program or function body. It's not a runtime  
> directive. You can't change to strict mid-parse, let alone at runtime.

Huh, I guess I assumed since you could change it depending on context
(eg within a function) as per John's post it was configurable at
runtime.  So you couldn't do:

(function() {
    var main = function() { /* do stuff here */ };
    var strict = function() {
        "use strict";
        main();                        // <-- A
	eval("("+main.toString+")()"); // <-- B
    };

    // Pretend ecmascript.version exists or a library to detect 
    // the ES engine's capability is used.  :-)
    if (ecmascript.version <= 5)
        strict();
    else
        main();
})();

Is strict mode only enabled inside strict(), but never inside main()?

I'm guessing the code inside A is executed outside the strict context in
A, but I'm unsure of what B would do (scary code indeed).

> > As a side note, it would be nice if some sort of strictness stability
> > were to be guaranteed like API/ABI stability within major ES versions.
> > So that ES 5.1 strict == ES 5 strict != ES 6 strict.
> 
> There won't be a 5.1 -- again we are not CPython, standards committees  
> don't do minor or patch releases, and the Web moves slowly.
> 
> Definitely the notion of strictness should be stable. We don't know  
> yet that we could make an ES6 "use strict" any stricter for existing  
> content. It might be that doing so would, in that future year, "break  
> (too much of) the Web". Even if there were explicit version selection  
> (probably there will have to be for ES6, to hide new syntax from old  
> user agents), if the migration tax is too high for a proposed  
> "stricter" strict mode, it may not fly.
> 
> But for ES5 we are not getting into versioning. As noted previously,  
> there are at least two aspects to versioning: <script> version,  
> defaultable via an HTTP header (expressible with <meta http- 
> equiv=...>); and "frame version" for the shared object model in the  
> whole window or frame that loads content including scripts.
> 
> /be

Once again thanks for the thorough and patient explanations.  I was
thinking under a number of wrong assumptions and just plain wrong.  :-)

Looking forward to using this feature!

-schmichael
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 197 bytes
Desc: This is a digitally signed message part
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20090522/f83b2e1b/attachment-0001.bin>


More information about the es-discuss mailing list