Procedo a recopilarlo por si acaso alguien se lo ha perdido:
@joseanpg dijo:
--[[
con la construcción let(a=1){statements} tenemos una clara analogía con
los parametros formales de una funcion ...
... no hay lugar para grandes confusiones por tanto, el ámbito y la
visibilidad son claros: coinciden.
con la construccion let(a=1) expression ocurre lo mismo.
pero consideremos algo como esto: { ....; let a = 1; ...} eso equivale a
let(a=undefined){ ....} y ya la estamos liando
una declaración/definición como esa por ahí perdida en un bloque de 50
líneas te esta creando un ámbito de bloque casi ...
... sin darte cuenta. Y encima ya tenemos dos tipos de variables bien
vivas: las que tienen ambito de bloque con let y las que ...
... tienen ámbito de función con var. Me diras que las otras
construcciones let hacen lo mismo, y es cierto, pero como están al ...
... principio del bloque los riesgos son menores.
hay situaciones "ambiguas" sobre las que no sé si finalmente tomaron una
decisión: ...
¿for(let i=0;....) <--> let(i=0){for(;...)? (es lo más lógico) ó ...
... ¿se creará un ambito nuevo en cada iteración?
]]--
harmony:let: http://wiki.ecmascript.org/doku.php?id=strawman:let_expressions
Realmente no tengo una opinión demasiado formada al respecto, por el momento me da la impresión de que agrega demasiada complejidad para los beneficios que propone. El caso del for es bastante paradigmático, me gustaría ver el resultado final.
a = []; for (let i = 0; i < 3; i++) a.push(function () { return i; }); print(a[0]()) print 3 or 0?for (let i=0;i<N;i++){...} differs from let i=0; for (;i<N;i++){...}.for (let i in o) – here everyone agrees that in this form, we want fresh binding per iteration. Same for for-of (see iterators).