Edit in JSFiddle

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;
}