<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><div><div>On Jul 10, 2008, at 4:02 PM, Richard Cornford wrote:</div><br><blockquote type="cite"><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">Something like:-</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">fucntion getSomething(arg){</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">  </span>if(caseOneTest){</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">    </span>getSomething = function(x){</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">      </span>//actions appropriate for case one</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">    </span>};</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">  </span>}else if(caseTwoTest){</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">    </span>getSomething = function(x){</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">      </span>//actions appropriate for case two</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">    </span>};</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">  </span>}else{</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">    </span>getSomething = function(x){</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">      </span>//actions appropriate for other cases</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">    </span>};</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">  </span>}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "><span class="Apple-converted-space">  </span>return getSomething(arg);</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">}</div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "><br></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">It is the ability to do this sort of thing that helps make javascript so<span class="Apple-converted-space"></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; ">well suited to browser scripting.<span class="Apple-converted-space"></span></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; min-height: 14px; "></div></blockquote><br></div><div>Oliver Steele blogged about this kind of memoization a couple of years ago:</div><div><br></div><div><a href="http://osteele.com/archives/2006/04/javascript-memoization">http://osteele.com/archives/2006/04/javascript-memoization</a></div><br><div>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.</div><div><br></div><div>From Allen's list:</div><div><br></div><div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 48px; text-indent: -24px; "><font face="Symbol" size="4" style="font: 15.0px Symbol"></font><font face="Times New Roman" size="1" style="font: 9.0px Times New Roman"> </font><font face="Calibri" size="4" style="font: 15.0px Calibri">Illegal for a function to have duplicately named formal parameters</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 48px; text-indent: -24px; "><font face="Symbol" size="4" style="font: 15.0px Symbol"></font><font face="Times New Roman" size="1" style="font: 9.0px Times New Roman"> </font><font face="Calibri" size="4" style="font: 15.0px Calibri">Illegal for a function to contain a top level function declaration with a function name that is the same as a formal parameter.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 48px; text-indent: -24px; "><font face="Symbol" size="4" style="font: 15.0px Symbol"></font><font face="Times New Roman" size="1" style="font: 9.0px Times New Roman"> </font><font face="Calibri" size="4" style="font: 15.0px Calibri">Illegal to have multiple top level function declarations for the same function name</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 48px; text-indent: -24px; "><font face="Symbol" size="4" style="font: 15.0px Symbol"></font><font face="Times New Roman" size="1" style="font: 9.0px Times New Roman"> </font><font face="Calibri" size="4" style="font: 15.0px Calibri">Illegal to have a function declaration with the same name as var declaration.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 48px; text-indent: -24px; "><font face="Symbol" size="4" style="font: 15.0px Symbol"></font><font face="Times New Roman" size="1" style="font: 9.0px Times New Roman"> </font><font face="Calibri" size="4" style="font: 15.0px Calibri">Illegal for a function to contain a var declaration with the same name as a formal parameter.</font></div><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 48px; text-indent: -24px; "><font face="Symbol" size="4" style="font: 15.0px Symbol"></font><font face="Times New Roman" size="1" style="font: 9.0px Times New Roman"> </font><font face="Calibri" size="4" style="font: 15.0px Calibri">Illegal to assign to a top-level function name.</font></div></div><div><br></div><div>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).</div><div><br></div><div>Shadowing a formal parameter with a nested function name also seems likely to be a mistake.</div><div><br></div><div>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.</div><div><br></div><div>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?</div><div><br></div><div>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.</div><div><br></div><div>/be</div></body></html>