unscopables-mutation.js (1255B)
1 // SKIP test262 export 2 // Pending review. 3 4 // When obj[@@unscopables].x changes, bindings appear and disappear accordingly. 5 6 let x = "global"; 7 function getX() { return x; } 8 9 let unscopables = {x: true}; 10 let obj = {x: "obj", [Symbol.unscopables]: unscopables}; 11 12 with (obj) { 13 assertEq(x, "global"); 14 x = "global-1"; 15 assertEq(x, "global-1"); 16 assertEq(obj.x, "obj"); 17 18 unscopables.x = false; // suddenly x appears in the with-environment 19 20 assertEq(x, "obj"); 21 x = "obj-1"; 22 assertEq(getX(), "global-1"); // unchanged 23 assertEq(obj.x, "obj-1"); 24 25 unscopables.x = true; // *poof* 26 27 assertEq(x, "global-1"); 28 x = "global-2"; 29 assertEq(getX(), "global-2"); 30 assertEq(obj.x, "obj-1"); // unchanged 31 32 // The determination of which binding is assigned happens when the LHS of 33 // assignment is evaluated, before the RHS. This is observable if we make 34 // the binding appear or disappear during evaluation of the RHS, before 35 // assigning. 36 x = (unscopables.x = false, "global-3"); 37 assertEq(getX(), "global-3"); 38 assertEq(obj.x, "obj-1"); 39 40 x = (unscopables.x = true, "obj-2"); 41 assertEq(getX(), "global-3"); 42 assertEq(obj.x, "obj-2"); 43 } 44 45 assertEq(x, "global-3"); 46 47 reportCompare(0, 0);