/*=== undefined undefined 123 123 ===*/ /* Variable declaration is an 'empty' statement at the top level. * It doesn't contribute to an implicit return value. */ try { print(eval("var i;")); } catch (e) { print(e.name); } try { print(eval("var i = 1;")); } catch (e) { print(e.name); } try { print(eval("123; var i;")); } catch (e) { print(e.name); } try { print(eval("123; var i = 1;")); } catch (e) { print(e.name); } /*=== SyntaxError works SyntaxError ===*/ /* Variable name must be an Identifier, which exclused all * reserved words. The set of reserved words is different * in strict mode. */ try { eval("var for = 1;"); } catch (e) { print(e.name); } try { /* 'implements' is not a reserved word in non-strict mode */ eval("var implements = 'works'; print(implements);"); } catch (e) { print(e.name); } try { /* 'implements' IS a reserved word in strict mode */ eval("'use strict'; var implements = 'works'; print(implements);"); } catch (e) { print(e.name); } /*=== works works SyntaxError SyntaxError ===*/ /* Strict mode also prohibits use of 'eval' or 'arguments' as * variable name, even though they are not reserved words. * * These tests are made within a function, because attempts to * re-declare eval/arguments will result in a TypeError. */ try { eval("function f1() { var eval = 'works'; print(eval); }; f1();"); } catch (e) { print(e.name); } try { eval("function f2() { var arguments = 'works'; print(arguments); }; f2();"); } catch (e) { print(e.name); } try { eval("function f3() { 'use strict'; var eval = 'works'; print(eval); }; f3();"); } catch (e) { print(e.name); } try { eval("function f4() { 'use strict'; var arguments = 'works'; print(arguments); }; f4();"); } catch (e) { print(e.name); }