JavaScript中,with中的为什么不能给对象添加属性?

考虑一下代码:

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=...才对,既然这样,不就和第二个没有区别了吗?但为什么运行结果却大相径庭呢?

阅读 1.9k
1 个回答

关键字左查询 右查询
摘录:

对等号左边变量的查询。在整条作用域链中,如果没有找到变量的声明,js引擎会自动在全局声明一个同名变量;但是这个变量的声明是不会提升的。
对等号非左边变量的查询。在整条作用域链中,如果没有找到变量的声明 直接抛ReferenceError错误。

所以name = new_name,name没找到,声明到全局。new_name在obj上没找到,但是在函数内找到了,所以全局name='Amy'

给你补两个链接:

这本书可读,推荐读。

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