disabling "use strict"; everywhere

Andrea Giammarchi andrea.giammarchi at gmail.com
Wed Jan 30 09:38:08 PST 2013


last examples, for archive reasons:

function isStrict() {"use strict";
  return this;
}

with(false){
  alert(isStrict());      // global object
  alert((0, isStrict)()); // undefined
}

mystery solved, still something to be aware for library authors. I'll
explain in a tiny counter post later on.

br


On Wed, Jan 30, 2013 at 9:34 AM, Andrea Giammarchi <
andrea.giammarchi at gmail.com> wrote:

> thanks, that makes sense. I have tried this too:
>
> with({}){
>   function isStrict() {"use strict";
>     return this;
>   }
>   alert(isStrict()); // global object
> }
>
> still global though, but I believe that a side effect of the with
> statement.
>
> Weird that expressions behave outside that implicit context.
>
> Libraries wrapped in inline expressions seem to be safe then, hooooray I
> guess :-)
>
>
>
> On Wed, Jan 30, 2013 at 9:18 AM, Andreas Rossberg <rossberg at google.com>wrote:
>
>> On 30 January 2013 18:00, Andrea Giammarchi <andrea.giammarchi at gmail.com>
>> wrote:
>> > 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
>> > }
>> >
>> > 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.
>>
>> That is, er, balls, of course. All that happens here is that inside
>> the 'with', a call to a _toplevel_ function like 'isStrict()' becomes
>> 'this.isStrict()', and so receives the global object. That does not
>> otherwise change strictness, however. Try:
>>
>>   with(this) {
>>     function isStrict() { "use strict"; var x; delete x; }
>>     alert(isStrict());
>>   }
>>
>> for example. Moreover, calls to functions not resolving to global
>> definitions are completely unaffected, so are calls using 'call' or
>> 'apply':
>>
>>   with(this) {
>>     function isStrict() { "use strict"; return this; };
>>     function call(f) { f() };
>>     alert(call(isStrict)); // undefined
>>     alert(isStrict.call()); // undefined
>>  }
>>
>> Both calls would return window in sloppy mode.
>>
>> /Andreas
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20130130/30bfef04/attachment.html>


More information about the es-discuss mailing list