/*
 *  With statement (E5 Section 12.10).
 */

var obj;

/*===
undefined
10
===*/

/* Since 'with' does not alter the variable environment (which is
 * used for variable declarations), any declarations should go to
 * the function level instead.
 */

obj = { x: 100 };

function f_decl1() {
    with (obj) {
        eval("var foo = 10;");  /* created in function */
    }
    print(obj.foo);  // -> undefined
    print(foo);      // 10
}

try {
    f_decl1();
} catch (e) {
    print(e.name);
}

/*===
100
undefined
===*/

/* Since 'with' delete operations walk through the lexical environment
 * (same as variable lookup) and not the variable environment (for
 * declarations), deleting properties of the bound object should be
 * possible.
 */

obj = { x: 100 };

function f_del1() {
    var x = 200;  /* should not affect anything */
    print(obj.x);
    with (obj) {
        delete x;
    }
    print(obj.x);
}

try {
    f_del1();
} catch (e) {
    print(e.name);
}


