It is a bug in WebKit. Consider<div><br></div><div><div>  (function(global) {</div><div>    &#39;use strict&#39;;</div><div>    global[&#39;foo&#39;] = 88;</div><div>    foo = 99;</div><div>  })(this);</div><div><br></div>
<div>This code is not erroneous. By the time it assigns to global foo, there is a global foo and so there&#39;s no problem to report. Minefield (FF nightly) does this correctly. WebKit reports this as a SyntaxError (I just checked), since &quot;early&quot; is too early to tell in general that there will be nothing wrong by the time the assignment is executed.</div>
<div><br></div><div><br></div><div>That aside, I&#39;d like to offer my congratulations to WebKit for taking this huge step towards strict mode support!</div><div><br></div><br><div class="gmail_quote">On Wed, Oct 13, 2010 at 6:59 AM, Juriy Zaytsev <span dir="ltr">&lt;<a href="mailto:kangax.dev@gmail.com">kangax.dev@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Strict mode support has just landed in WebKit. While running few simple tests on it (<a href="http://kangax.github.com/es5-compat-table/strict-mode/" target="_blank">http://kangax.github.com/es5-compat-table/strict-mode/</a>), I noticed that WebKit reports some of the errors early. For example, as far as I understand, assignment to an unresolvable reference (in strict mode) ought to throw ReferenceError — as explained in 11.13.1 (Simple Assignment) and 8.7.2 (PutValue).<div>

<br></div><div>&quot;use strict&quot;;</div><div>i_dont_exist = 1; // &lt;-- should throw ReferenceError</div><div><br></div><div>However, in WebKit this is a SyntaxError (with a somewhat cryptic message of &quot;Parse Error&quot;, but that&#39;s irrelevant here).</div>

<div><br></div><div>What I&#39;m not sure about is whether this is allowed per Chapter 16. The list of early errors does not include this scenario. It does allow to treat &quot;assignment to non-reference&quot; as an early error (e.g. 3 = 4), but says nothing about assignment to an unresolvable reference. It also seems to disallow any deviations in a very explicit manner:</div>

<div><br></div><div>  &quot;An implementation shall not treat other kinds of errors as early errors even if the compiler can prove that a construct cannot execute without error under any circumstances. An implementation may issue an early warning in such a case, but it should not report the error until the relevant construct is actually executed.&quot;</div>

<div><br></div><div>The reason I&#39;m bringing this up is because my test suite expected ReferenceError, and so looked like:</div><div><br></div><div>try {</div><div>  i_dont_exist = 1;</div><div>}</div><div>catch(err) {</div>

<div>  assert(err instanceof ReferenceError);</div><div>}</div><div><br></div><div>...which resulted in SyntaxError, preventing entire set from running. </div><div><br></div><div>Is this kind of early errors allowed and I missed something in the specs? Or should one of — WebKit or spec —  be changed accordingly? Note that nightly FF — the only other browser with strict support at the moment — throws ReferenceError, as expected.</div>

<div><br></div><div>cc&#39;ing Oliver</div><div><br></div><div>Thank you.</div><div><br></div><div>-- </div><div>kangax</div>
<br>_______________________________________________<br>
es5-discuss mailing list<br>
<a href="mailto:es5-discuss@mozilla.org">es5-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es5-discuss" target="_blank">https://mail.mozilla.org/listinfo/es5-discuss</a><br></blockquote></div><br><br clear="all"><br>-- <br>    Cheers,<br>    --MarkM<br>
</div>