考虑一下代码:
function setName(obj,new_name){
with(obj){
name=new_name;
}
}
var person={};
setName(person,"Amy");
console.log(person);
其输出结果却是一个空对象,里面并没有name
属性。但是在全局作用域内却能找到这个name
。但是如果这么写:
function setName(obj,new_name){
obj.name=new_name;
}
var person={};
setName(person,"Amy");
console.log(person);
却能得到具有name
属性的对象。
为什么?二者区别到底在哪里?我理解的的是with
中的name=...
应该等价为obj.name=...
才对,既然这样,不就和第二个没有区别了吗?但为什么运行结果却大相径庭呢?
关键字左查询 右查询
摘录:
所以
name = new_name
,name没找到,声明到全局。new_name在obj上没找到,但是在函数内找到了,所以全局name='Amy'给你补两个链接:
这本书可读,推荐读。