function assert(value, desc) { var res = $("#results"); var li = document.createElement("li"); li.className = value ? "pass" : "fail"; li.appendChild(document.createTextNode(desc)); res.append(li); } // with creates a scope within which properties can be referenced without prefix // with is different than this // mostly with is used as a convenience of not having to duplicate variable references var room = { lightsOn: false, switchLights: function () { this.lightsOn = !this.lightsOn; } }; var switchLights = false; with(room) { assert(switchLights !== false && typeof switchLights == "function", "switchLights is from the room object"); assert(this !== room, "with doesnt replace this"); lightsOn = true; assert(lightsOn === true, "properties can be assigned"); someNewFunc = function () { return true; }; assert(room.someNewFunc === undefined, "someNewFunc didnt get added to the room but to the window object"); assert(window.someNewFunc(), "someNewFunc got added to the window object"); } assert(switchLights === false, "outside with switchLights is the outer var");
<div id="results" />
body { margin:10px; } .pass { color:green; } .fail { color:red; text-decoration:line-through; }