日期:2014-05-16  浏览次数:20337 次

我被with语句彻底搞晕了
代码如下所示:
JScript code

    var person={
    name:'aaa'
        }
    with(person){
    var name='bbb';
    var age='27';
    alert(name);//bbb
    alert(age);//27
    }
    alert(name);//undefined
    alert(age);//27

    with(location){
    var href="ccc";
    alert(href);//file://E:test.html
    }
    alert(href);//undefined

两个问题想请教:
1.关于with代码的作用域链顺序??
在with(person)中,我们alert(name)的结果是局部变量'bbb'而不是person.name的值'aaa'
在with(location)中,我们alert(href)的结果是location.href的值'file://E:/test.html'而不是局部变量'ccc'
这两个不一致啊,有矛盾啊!!???
2.关于with代码内部定义的变量,外部究竟能不能引用?
在with(person)中,我们定义了两个变量name和age,但是在with的外面,name不能使用,但是age却可以使用?
这两个也不一致啊?有矛盾啊???!!!


------解决方案--------------------
with语句很特殊而且不被推荐使用,解析
 var person = {
name: 'aaa'
 }
 with(person) {
var name = 'bbb';//语句1
var age = '27';//语句2,创建变量age
alert(name === person.name);//true
 }
内部创建的name指针指向了person.name,等价于:
 person.name = 'bbb';//语句1
 var age = '27';//语句2

声明的name很其名的被当作person的属性处理,于是外部的name值为undefined;age与person无关联,变量被创建,出了with语句仍然使用。

后半部分的href的赋值语句是有效的,浏览器环境下会跳转到后缀为"ccc"的超链接,等同于给location.href赋值,但同理只是修改了这个属性,外部herf未定义。

鉴于with语句内部声明的奇怪逻辑及低下效率,你几乎看不到有人用。


------解决方案--------------------
你看下面的两个写法是不是一样的?
JScript code
var person =  new Object();
person.name="jim";
with(person) {
  var name = 'bbb';//语句1
  var age = '27';//语句2,创建变量age
  alert(name === person.name);//true
 }

------解决方案--------------------
探讨

那再请问,您说var location='ccc'这个赋值语句是成功的了,那为什么我在这个语句后面alert(href)输出的内容不是'ccc',而是file://E:test.html呢?请指教,谢谢啦!引用:

with语句很特殊而且不被推荐使用,解析
var person = {
name: 'aaa'
}
with(person) {
var n……

------解决方案--------------------
不是不推荐用with了吗?
他的作用和call,apply类似,改变作用域!