function shouldThrowTDZ(func) { var hasThrown = false; try { func(); } catch(e) { hasThrown = e instanceof ReferenceError; } if (!hasThrown) throw new Error("Did not throw TDZ error"); } function test(f, n = 1000) { for (let i = 0; i < n; i++) f(); } test(function() { function foo() { eval("20"); let eval; } shouldThrowTDZ(foo); }); test(function() { function foo() { eval("20"); let {eval} = {eval:450}; } shouldThrowTDZ(foo); }); test(function() { function foo() { eval("20"); const eval = 45; } shouldThrowTDZ(foo); }); test(function() { function foo() { eval("20"); } shouldThrowTDZ(foo); let eval; }); test(function() { function foo() { eval("20"); } shouldThrowTDZ(foo); let {eval} = {eval:450}; }); test(function() { function foo() { eval("20"); } shouldThrowTDZ(foo); const eval = 45; }); { let threw = false; try { eval(20); let eval; } catch(e) { threw = e instanceof ReferenceError; } if (!threw) throw new Error("Bad") } { let threw = false; try { eval(20); const eval = 25; } catch(e) { threw = e instanceof ReferenceError; } if (!threw) throw new Error("Bad") }