Newly revised Section 10 for ES3.1.
Maciej Stachowiak
mjs at apple.com
Thu Jul 10 17:17:30 PDT 2008
(Adding lists back to Cc, which I assume you meant to do)
On Jul 10, 2008, at 5:06 PM, Garrett Smith wrote:
> Authors who assume that the function was conditionally declared in IE
> and Opera (and who knows what else) would be making false assumption.
That's true, but what I have seen in practice is that code can end up
depending on its false assumption being violated, or working by luck.
For example, you see code like:
if (!isIE) {
function somethingEssential() { }
}
where somethingEssential is then unconditionally called.
>
>
> If subsequent code relied on that false assumption, and produced
> intended results, it would be only by coincidence:
>
> if(!isIE && !isOpera) {
> function a(){ return 0; }
> }
> else (
> function a(){ return 1; } // IE gets here (coincidence unrelated to
> else)
> }
>
> That would be very lucky programming, because if reversed, it would
> not produce the same results:
>
> if(isIE && isOpera) {
> function a(){ return 1; }
> }
> else (
> function a(){ return 0; } // IE gets here.(coincidence unrelated to
> else)
> }
>
> FunctionDeclarations are processed during variable instantiation,
> before code execution. IE and Opera (and probably other browsers)
> would always take the last one because in these environments, it would
> have the effect of:-
>
> function each(){ return 1; }
> function each(){ return 0; }
> if(isIE && isOpera) {
> }
> else {
> }
>
>> I do not know if it is possible to make a proposal that both is
>> useful
>> and doesn't break the Web, within the premises of ES3.1. But it seems
>> to me that a proposal that is almost sure to break the Web would be
>> unacceptable under the ES3.1 assumptions, and locking it into a spec
>> without first doing some form of widespread testing seems like a
>> totally broken process.
>>
>
> Is it possible to know how much breakage would occur?
I don't know, but I am pretty sure it would be a non-zero amount. I
think it is up to proponents of this proposal to somehow demonstrate
that the level of breakage would be low enough; the presumption should
be in favor of compatibility.
> Web scripts that attempt to work across IE and Mozilla that use a
> FunctionDeclaration in a Block either exhibit a bug or get lucky. If
> FunctionStatement is used, it is not likely to be used on public
> websites.
I know it has been used on public web sites.
>
>
> A major US defense company I once dealt with had an app that was
> Mozilla-only (due to security concerns in IE). It is possible that
> they successfully used a FunctionStatement. It seems that making
> FunctionStatement a syntax error could cause a problem in a
> Mozilla-only application, where as making FunctionStatement a standard
> would not cause problems (unless the problem was that the original
> code so badly confused):-
The ES3.1 proposal (now withdrawn, I believe) would make your example
below throw a runtime error, since the declaration of function a would
have only block scope and so would be unavailable after the if
statement completes.
>
>
> if(IE || Opera) {
> function a(){ throw Error(); } // Error, but never reached.
> } else {
> function a(){} // No Error
> }
>
> a();
>
> Implementation of the FunctionStatement would cause the Error to be
> thrown when IE or Opera were true. How likely is such code to exist?
> Such code is arguably already broken and would seem to perform against
> the author's intention in IE.
>
> That sounds to me to be:
> 1) Somewhat useful
> 2) Probably wouldn't cause much breakage (test).
I'm not sure what specifically you propose, but it would make me happy
if block-level function declarations could be standardized in a way
that tries to be compatible with existing practice. I realize this is
a challenge.
Regards,
Maciej
More information about the Es4-discuss
mailing list