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

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

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

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

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


贴段代码应该就比较清楚了
var a, x, y;
var r = 10;

with (Math) {
  a = PI * r * r;
  x = r * cos(PI);
  y = r * sin(PI / 2);
}

参见MDN文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/with

 with (expression) {
  statement
}

语法描述里提到

Adds the given expression to the scope chain used when evaluating the statement. The parentheses around the expression are required.


function getUri()
        {
                var href="http://www..com";
                with(location)
                {
                    var url=href;
                }
                return url;
        }
        console.log(getUri());

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


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

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

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


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

【热门文章】
【热门文章】