<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:D="DAV:" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:Z="urn:schemas-microsoft-com:" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.apple-style-span
        {mso-style-name:apple-style-span;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Arial","sans-serif";
        color:#0070C0;
        font-weight:normal;
        font-style:normal;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-US link=blue vlink=purple style='word-wrap: break-word;
-webkit-nbsp-mode: space;-webkit-line-break: after-white-space'>

<div class=Section1>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:#1F497D'>Since we are discussing 'with' in particular - i</span><span
style='color:#1F497D'>t may be difficult to tighten spec language to fix 'with',
but I do believe that if there is some way in which we can deprecate/ban 'with'
we should consider it.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:#1F497D'>For e.g. </span><span style='color:#1F497D'>'with' interacts
with other language features in surprising ways. Consider the following
(contrived) case:<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>var a = 1;<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>function foo() {<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> var o = {a : 2};<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> with (o) {<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> var a = 3;<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> }<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> print (a);<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> print(o.a);<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>}<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>foo();<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>print(a);<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>While it would look like the
variable declaration from within &#8216;with&#8217; should create a variable at
foo scope and set its value to 3, that&#8217;s not what&#8217;s supposed to
happen. Rules for variable instantiation (10.1.3), variable declaration
grammar (12.2), identifier reference (11.1.2), and scope chain and identifier
resolution (10.1.4) result in the above code being evaluated as if it were the
following:<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>var a = 1;<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>function foo() {<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> var o = {a : 2};<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> var a = undefined;<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> with (o) {<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> a = 3;<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> }<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> print(a);<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'> print(o.a);<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>}<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>foo();<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>print(a);<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>Notice that </span><span
style='color:#1F497D'>&#8220;var a = 3&#8221; ends up creating the variable in
one scope and setting the value on an element in another scope. How can that be
intentional?<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'>It may be difficult to tighten
spec language to fix this, but we should consider deprecating/banning 'with' in
an opt-in 'strict' mode (or 'subset' mode).<o:p></o:p></span></p>

<p class=MsoNormal><span style='color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:10.0pt;font-family:"Arial","sans-serif";
color:#1F497D'>pratap<o:p></o:p></span></p>

<p class=MsoNormal><a name="_MailEndCompose"><span style='font-size:10.0pt;
font-family:"Arial","sans-serif";color:#0070C0'><o:p>&nbsp;</o:p></span></a></p>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in'>

<p class=MsoNormal><b><span style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>From:</span></b><span
style='font-size:10.0pt;font-family:"Tahoma","sans-serif"'>
es4-discuss-bounces@mozilla.org [mailto:es4-discuss-bounces@mozilla.org] <b>On
Behalf Of </b>Brendan Eich<br>
<b>Sent:</b> Tuesday, June 17, 2008 12:20 PM<br>
<b>To:</b> Mark S. Miller<br>
<b>Cc:</b> es3.x-discuss@mozilla.org; es4-discuss@mozilla.org; Douglas
Crockford<br>
<b>Subject:</b> Re: Subset relation (was: RE: ES3.1 Draft: 11 June 2008 version
available)<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<div>

<div>

<p class=MsoNormal>On Jun 16, 2008, at 10:48 PM, Mark S. Miller wrote:<o:p></o:p></p>

</div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>On Mon, Jun 16, 2008 at 10:19 PM, Brendan Eich &lt;<a
href="mailto:brendan@mozilla.org">brendan@mozilla.org</a>&gt; wrote:<o:p></o:p></p>

</div>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>I am not going to repeat what I wrote at an earlier point in
this thread (13<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>June at 10:24) -- you didn't reply to what I wrote then. Did
that message<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>not reach you?<o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Are you referring to<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>&lt;<a
href="https://mail.mozilla.org/pipermail/es3.x-discuss/2008-June/000108.html">https://mail.mozilla.org/pipermail/es3.x-discuss/2008-June/000108.html</a>&gt;?<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<p class=MsoNormal>Yes.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal>It was the closest match I could find. I responded to this
message.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>What remaining point in this message do you feel still needs
to be<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>addressed? I'm not being difficult. I just reread this
message and<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>couldn't spot it.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<p class=MsoNormal>You&nbsp;<a
href="https://mail.mozilla.org/pipermail/es3.x-discuss/2008-June/000109.html">replied</a>&nbsp;only
to the bit about reformed with, where I wrote:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>&quot;Reformed with&quot; was an attempt to restore lexical
scope by exact type&nbsp;annotation. That's what people voted down, not the
ES1-3 &quot;with&quot; statement.<o:p></o:p></p>

</div>

</blockquote>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>but that was not the main point (since reformed with was
withdrawn), it was just setting the record straight (&quot;reformed with&quot;,
not &quot;strict with&quot; -- and the fact that it was voted down with red on
the spreadsheet does not argue against plain old &quot;with&quot; being allowed
in strict mode).<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>The main point was that (a) 'with' is widespread and
popular; therefore (b) strict mode that bans 'with' could fail to be used.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>The question isn't whether an existing statement is
&quot;good enough&quot;, it's<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>whether a strict mode that bans it is &quot;usable
enough&quot;.<o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>A strict mode which doesn't ban is clearly not.<o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<p class=MsoNormal>Why &quot;clearly&quot;? Usability depends on users and
&quot;ergonomics&quot;. Something about 'with' is usable enough that users
persist in writing programs using it. These users say (when they speak up
coherently at all) that 'with' makes the language more convenient. Well-known
JS hackers say this, to me even, and get annoyed by nagging such as was found
in older Firefoxes (console warnings about &quot;deprecated with&quot;).<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal><span class=apple-style-span>If you get rid of
&quot;with&quot;, then the static analysis rule in ES4 becomes</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>very simple: all free variables in a program (script,
compilation<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>unit, whatever) are global references, to be looked up as
properties<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>of that program's global object, whether or not those
properties are<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>present.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<p class=MsoNormal>That allows lexical-reference typos through to run-time,
where they become errors -- that is not something the old, withdrawn strict
mode in ES4 allowed.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>It's true that 'with' prevents analysis from deciding where
a free name will be found, but with the old strict mode, that's actually a
useful escape hatch. Otherwise (no 'with') the name would have to resolve to a
compiler-visible global definition, or you would have to reach for eval.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>This old notion of strict mode was to be an optional
feature, at the<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>implementation's discretion. We dropped it in favor of 'use
strict' a la<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>Perl -- &quot;use good taste and sanity&quot;.<o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>And is &quot;with&quot; either in good taste or sane?<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<p class=MsoNormal>I avoid 'with', but I try not to confuse my taste with
others' tastes (plural), or with necessity. Why is it necessary for strict mode
to ban 'with'?<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<div>

<p class=MsoNormal><span class=apple-style-span>The global object makes the
contents of the global scope unknown. But</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>it does not ambiguate which variable name occurences are to
be<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>interpreted as references into this global scope. Without
&quot;with&quot;, ES4<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>strict scopes would be statically analyzable. I'm surprised
you're<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>willing to give that up.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

</div>

<div>

<p class=MsoNormal>As I wrote previously, all browser implementations have to
support 'with' and deoptimize code in its body. There's no savings to be had in
rejecting it from strict mode, and doing so takes a tiny bit of extra code. On
the other hand, such a strict mode may be less used than 'with', because of
'with' perduring.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Is 'with' any worse than eval, for the purposes of the
analysis you have in mind, if you already allow the &quot;operator&quot; form
of eval in strict mode?<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal><br>
<br>
<o:p></o:p></p>

<blockquote style='margin-top:5.0pt;margin-bottom:5.0pt'>

<div>

<p class=MsoNormal>so is kicking 'with' out of<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>strict mode worth it, especially if it impairs adoption of
&quot;use strict&quot;?<o:p></o:p></p>

</div>

</blockquote>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Yes. Otherwise I don't see the point of &quot;use
strict&quot;.<o:p></o:p></p>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Can you define the point of &quot;use strict&quot; other
than by appealing to taste?<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>/be<o:p></o:p></p>

</div>

</div>

</body>

</html>