Function hoisting
Brendan Eich
brendan at mozilla.org
Sat Jul 19 10:59:25 PDT 2008
On Jul 19, 2008, at 9:51 AM, Brendan Eich wrote:
>> if (true) {
>> function x() {
>> return 1;
>> }
>> } else {
>> function x() {
>> return 2;
>> }
>> }
>
> Block scope -- an x in each branch's block. This avoids capturing
> problems. To make a binding that extends beyond either block one just
> uses let or var in an outer scope, and assigns. Richard Cornford made
> this point in a different context last week (about memoizing top
> level functions via var, not by overwriting a function definition).
Note also how this neatly separates duties with respect to const vs.
var/let. If you want a const binding to the function that survives
the end of block, you can do it in ES4, where const is assign-once:
const x;
if (truthy) {
x = function () 1;
} else {
x = function () 2;
}
// use x here
There is no free lunch, though. A typed function would probably want
the signature restated as an annotation on the const. And of course
if you want the function to have an intrinsic name, you'll need named
function expressions above, which may redundantly restate "x" as the
name of the function (as well as of the binding).
/be
More information about the Es4-discuss
mailing list