Newly revised Section 10 for ES3.1.

Brendan Eich brendan at mozilla.org
Thu Jul 10 19:49:24 PDT 2008


On Jul 10, 2008, at 4:02 PM, Richard Cornford wrote:

> Something like:-
>
> fucntion getSomething(arg){
>     if(caseOneTest){
>         getSomething = function(x){
>             //actions appropriate for case one
>         };
>     }else if(caseTwoTest){
>         getSomething = function(x){
>             //actions appropriate for case two
>         };
>     }else{
>         getSomething = function(x){
>             //actions appropriate for other cases
>         };
>     }
>     return getSomething(arg);
> }
>
> It is the ability to do this sort of thing that helps make  
> javascript so
> well suited to browser scripting.

Oliver Steele blogged about this kind of memoization a couple of  
years ago:

http://osteele.com/archives/2006/04/javascript-memoization

although his examples did not show top-level function being replaced.  
But it's a good point: strict mode wants to break useful (and used)  
patterns that change the value of a property created by a defining form.

 From Allen's list:

·        Illegal for a function to have duplicately named formal  
parameters
·        Illegal for a function to contain a top level function  
declaration with a function name that is the same as a formal parameter.
·        Illegal to have multiple top level function declarations for  
the same function name
·        Illegal to have a function declaration with the same name as  
var declaration.
·        Illegal for a function to contain a var declaration with the  
same name as a formal parameter.
·        Illegal to assign to a top-level function name.

I could see banning duplicate formal parameter names (I still have no  
memory of why Shon from Microsoft wanted these standardized in ES1 --  
possibly just because JScript already allowed them).

Shadowing a formal parameter with a nested function name also seems  
likely to be a mistake.

Multiple top-level function definitions having the same name? That  
must be allowed if the definitions are in separate scripts. In the  
same script, it could be a mistake, or a fast patch of some kind.  
Without #if 0 or nested comments (ES1-3 do not require them, I don't  
know of any implementations that do them either) it's hard to hide  
bulk code. Anyway, this seems less likely to be fruitful as a "good  
taste" strict-mode check, more somewhat likely to bite back.

Within the same program, function vs. var name conflict is probably a  
mistake to catch. I don't see it in web JS, but I'm not sure how  
uncommon it is. Anyone have insights?

Function containing a var x and taking formal parameter x? That's  
allowed and might be tolerated if the var has no initialiser, but if  
the var has an initialiser then it is very likely to be a mistake.  
Even when hacking and debugging it's rare to nullify an actual  
argument by declaring a var and assigning to it in the var  
declaration -- one would just assign without adding a var at the front.

/be
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.mozilla.org/pipermail/es-discuss/attachments/20080710/989ae8e7/attachment-0002.html 


More information about the Es4-discuss mailing list