通过测试及debug后, 得出结论, 仅代表个人意见:
with的本质, 就是构造一个作用域, 将with的对象的所有key, 声明为局部变量
var inner = '123'; var outer = {inner : 'hello world', another: 'hello with'}; window.obj = {outer: outer}; with(outer) { alert(inner); alert(another); alert(outer.inner); alert(window.obj.outer.inner); show(); } function show() { alert(inner); }
等同于以下代码
var inner = '123'; var outer = {inner : 'hello world', another: 'hello with'}; window.obj = {outer: outer}; (function(inner, another) { alert(inner); alert(another); alert(outer.inner); alert(window.obj.outer.inner); show(); })(outer.inner, outer.another); function show() { alert(inner); }
再看看下面这个常见的问题, 一目了然
var root = { branch: { node: 1 } }; with(root.branch) { root.branch = { node: 0 }; // 显示 1, 错误! alert(node); } // 显示 0, 正确! alert(root.branch.node);