代码如下所示:
- 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 }
------解决方案--------------------
------解决方案--------------------
不是不推荐用with了吗?
他的作用和call,apply类似,改变作用域!