Brendan Eich (2014-08-01T18:54:54.000Z)
domenic at domenicdenicola.com (2014-08-22T21:23:53.892Z)
The general problem is that body blocks are not exactly blocks, due to legacy cruft -- and this legacy cannot be separated from 'let' ideals because we want programmers to refactor from 'var' to 'let'. So we must give greater weight (compared to the ideal case of a body block just being a block) to refactoring hazards that result in silent but deadly bugs rather than early errors. In particular, ```js function f(a) { ... // TDZ let a = ...; ... } ``` and ```js function g() { try { ... } catch (e) { ... // TDZ let e = ...; ... } } ``` should be early errors because there's no useful shadowing going on with 'let' -- the TDZ means the outer binding cannot be used in the commented places -- but any prior version using 'var' would have worked and possibly allowed (coverage-dependent) uses of the "outer" (in catch's case, var hoists across the catch head in sloppy code; in the parameter case there's only ever one 'a' binding) use in the TDZ. So an early error does no actual harm in either case, and helps avoid bugs slipping past incomplete test coverage.