文档中提到:
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 就好像明确的告诉你,我这段代码是在这个对象空间内的,只要我有这个符号,你就别管别人。