Jon Zeppieri wrote: >> Suppose you're reading someone else's code: >> >> var a = 0; // Say you have noticed this declaration. >> // Several lines of code. >> for (let a = a; a < 10; a++) >> { // Several lines of code. >> let x = a; // Have you noticed the change in meaning? >> } >> let y = a; // Are you aware that a is unaffected by the loop? > > I don't find this confusing, at all. I think it could become > confusing if there were redundant declarations of the same variable, > as allowed by var.
Obviously the confusion occurs only if you miss |let a=a|, not if you see it. Program maintenance becomes more expensive when you must painstakingly look for things like |let a=a| everywhere. > Non-recursive bindings are sometimes useful (particularly for simple > code generation). It seems trivial to use different names. I really don't get this. Is there a shortage of letters? > After thinking about this a bit more, I don't know what single binding > semantics to prefer: > > let: closest to the immediate function expression + application > pattern in common use > let*: like let, but with left-to-right evaluation > letrec*: closest to current 'var' behavior If it's like var, people can re-use their knowledge about var. Let them spend their learning time on more useful things than tiny scoping intricacies. >> For very small and simple projects it's great that JavaScript lets >> you sprinkle your declarations all over the code, with redundant >> repetitions if you like. Block scope should be available also with >> this usage pattern, in my view. > > I *do* know, however, that I don't like this. > > I think you, Ingvar, are the lone champion of redundant variable declarations. Earlier I declared variables only once, and would sometimes forget. The bugs cost time. With var on every initialization the problem disappears. As a result, the lack of var has become a warning that I notice very clearly. Do I really want global here? I'd prefer an "outer" declaration, but have to use the lack of var instead. > I'm not sure who the champions of var hoisting are. (In another > thread, Brendan referred to hoisting as a wart.) That's me too, but it was combined with things that made hoisting all but disappear. Unfortunately my explanations were bad, and the proposal drowned under claims that I was instead proposing something very different and very unworkable that I never intended, and persistent attacks against this strawman. I did learn a lot about how to explain better, so maybe I could try again and get across this time. The real proposal was beautiful simplicity both in usage and implementation. >> Let statements might also enable throwing an error on undeclared >> names. > I can't imagine what you have in mind here. let (a = 3) { x = 5; } If you put |let (a = 3)| above your block, this might tell the compiler that you want everything neatly declared at the top, and therefore want an error thrown at the undeclared x. A strict mode regarding declarations. -- Ingvar von Schoultz _______________________________________________ Es-discuss mailing list Es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss