Короче - ДА
С является особенным, он делает dynamic binding. Это создает запутывающие ошибки, поэтому операторы with
не запускаются в strict mode.
Однако никто не сказал, что мы не можем немного повеселиться. Мы не можем изменить переменные замыкания, которые имеет функция, однако мы можем использовать динамическую природу JavaScript для чтения исходного кода функции и создания новой привязки. Это не основной язык или общий, но для случая, который вы попросили, это, безусловно, выполнимо.
Вот образец для самого базового дела, который вы задали (без вложенных замыканий, без параметров и т. Д.). Хотя вы не можете изменить закрытие, вы можете объявить новую функцию, которая выполняет тот же код другой.Позвольте мне сделать одно совершенно ясно - это грязный хак здесь;)
var scope = {foo: 'bar'},
foo = 'baz';
var func = function func() {
return foo;
}
// here, `foo` is closed over by the outer foo and it is 'baz'
document.body.innerHTML += " " + func(); // foo is still 'baz'
// foo is bar, since it's a different function here:
document.body.innerHTML += " " + withFunc({foo:"bar"},func);
function withFunc(obj, func) {
//declare a new function
return new Function("obj", // with a parameter obj
"with(obj){\n " + // do `with` on that parameter
"return "+func+"()\n}")(obj); // invoke and return original function
}
http://jsfiddle.net/42YX4/
Просто FYI: _ "Использование с утверждением не рекомендуется, так как это может быть источником запутанных ошибок и проблемы совместимости. [...] Использование с не рекомендуется и запрещено в строгом режиме ECMAScript 5. «_ - [MDN] (https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Справка/Заявления/с). – elclanrs