简而言之 -是的
with 很特别,它做动态绑定。它会产生令人困惑的错误,这就是with
语句不在严格模式下运行的原因。
然而没有人说我们不能有一点乐趣。然而,我们不能改变函数的闭包变量——我们可以利用 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/