js 的 with 语句如何深入理解?

文档中提到:
with 语句用于设置代码在特定对象中的作用域。

有人提到:
with语句将对象添加到当前作用域链的头部。

请问with具体应该如何理解呢?

经过测试:

var a = 123;
var b = {a : 321};
with(b){
    console.log(a); // 321
}

var a = 123;
var b = {}; 这里去掉b中的a属性
with(b){
    console.log(a); // 123
}

我的理解with语句中把对象b里面的属性的优先级高于该with所在作用域中其他同名变量。

w3school中也说道如果b中包含方法,则先回去找该方法是否是本地方法,然后再去b上找,没找到再去with所在作用域中,以此类推,如:

var escape = function(){
  console.log(321)
}

var b = {a : '发生的了空间', escape : function(){console.log(123)}};

with(b){
  escape(a)
}
回复
阅读 7k
4 个回答
function getUri()
        {
                var href="http://www.segmentfault.com";
                with(location)
                {
                    var url=href;
                }
                return url;
        }
        console.log(getUri());

没错,就是限定了命名空间;不用with(location);url的值就是www.segmentfault.com;用了with;url的值就是location.href;

你好像理解的没有错,with 就好像明确的告诉你,我这段代码是在这个对象空间内的,只要我有这个符号,你就别管别人。

with类似于java里面包的读取,它限定了命名空间,比如说

a.b.c.d.e = {f: 1}
with(a.b){
    console.log(c);
}

在with的大括号里面是a.b这个命名空间下的对象操作,另外你escape的例子,跑过吗,我用nodejs和chrome都跑过了,输出都是123,所以他应该是先找命名空间里的,再找global的

我的理解是,作用域链应该是变量的寻址空间,可以假想下某个域({})下面变量都存在一个Map里,代码执行的时候就从这个Map里寻找变量映射在内存里的地址。
所以

将对象添加到当前作用域链的头部。

这句话的意思应该是从这个对象(js的对象类似Map)开始寻址
说的不对,欢迎指正

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏