disabling "use strict"; everywhere

Claude Pache claude.pache at gmail.com
Wed Jan 30 09:56:54 PST 2013


Le 30 janv. 2013 à 18:00, Andrea Giammarchi <andrea.giammarchi at gmail.com> a écrit :

> let me rephrase ...
> 
> putting `with(this){` before any build process/inlined library and `}` at the end of all concatenated files **nothing** is strict anymore ^_^
> 
> function isStrict() {"use strict";
>   return this;
> }
> 
> isStrict(); // undefined
> 
> now, wraping the whole thing inside a with statement
> 
> with(this){
>   function isStrict() {"use strict";
>     return this;
>   }
>   alert(isStrict()); // global object
> }

Presumably some weirdness between "with" statement mixed with function declaration. You should test specifically the strictness, not the this-binding:

with(this){
  function test() {
    "use strict"
    return (function() { return this === void 0 })() 
  }
  alert(test()); // true
}

The test function is manifestly in strict mode regardless of its this-binding.

...

!! But wait, I think I understand what's happening:

var obj = {
    returnThis: function() { "use strict"; return this }
  , toString: function() { return 'I am "obj"' }
}
var otherReturnThis = function() { "use strict"; return this }

with(obj){
  alert(returnThis()); // 'I am "obj"'
  alert(otherReturnThis()); // undefined
}

Here, "returnThis()" is strictly equivalent to "obj.returnThis()", including the this-binding, while "otherReturnThis()" use "undefined" as target object

In your example, when you say "isStrict()", it is interpreted as "this.isStrict()", since "isStrict" is a property of "this" and "this" is the argument of the "with" statement. (You're still with me?) Nothing to do with strict mode

Ok, you convinced me that the semantic of the "with" statement is *really* weird, but not that you can disable strict mode. 

—Claude

> 
> forget the Function hack, there is no library able to ensure itself to be executed in strict mode.
> Using the width statement around any code makes it not strict.
> 
> Thoughts ?
> 
> 
> 
> 
> 
> 
> 
> 
> 
> On Wed, Jan 30, 2013 at 8:19 AM, Brandon Benvie <brandon at brandonbenvie.com> wrote:
> Correction, the use strict directive needs to appear as the first statement (ExpressionStatement) that's not an EmptyStatement and not a FunctionDeclaration. Anything else will cause the directive to be ignored.
> 
> 
> On Wed, Jan 30, 2013 at 11:15 AM, Brandon Benvie <brandon at brandonbenvie.com> wrote:
> To enable strict mode, the "use strict" expression must come as the first non-statement of a script or function body. That means 
>     function x(){}
>     "use strict";
> 
> Will enable strict mode, but
> 
>     (function x(){});
>     "use strict";
> 
> won't. To make your example strict, you'd have to do
>   
>     with (ob) {
>       (function(){
>         "use strict'";
>         /* concatenated stuff */
>       })();
>     }
> 
> 
> On Wed, Jan 30, 2013 at 10:48 AM, Claude Pache <claude.pache at gmail.com> wrote:
> Le 30 janv. 2013 à 06:12, Andrea Giammarchi <andrea.giammarchi at gmail.com> a écrit :
> 
>> I have a blog post about it called
>> 
>> Resurrecting The With Statement
>> 
>> and before I post the link, there the long story short:
>> 
>> putting `with(this){` before any build process/inlined library and `}` at the end of all concatenated files nobody is strict anymore ^_^
> 
> For what I understand of ES5, putting some random stuff (other than string literals or comments) before a "use strict" directive at the beginning of a file will disable it. This is a known fact, orthogonal to the "Function + with" dirty/creative hack of your blog post.
> 
>  —Claude
> 
>> 
>> http://webreflection.blogspot.com/2013/01/resurrecting-with-statement.html
> 
>> 
>> I actually like this possibility, but I'd like to know what you think about it
>> 
>> br
>> _______________________________________________
>> es-discuss mailing list
>> es-discuss at mozilla.org
>> https://mail.mozilla.org/listinfo/es-discuss
> 
> 
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
> 
> 
> 
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20130130/7943d627/attachment-0001.html>


More information about the es-discuss mailing list