当使用 'with' 关键字时,Javascript 中似乎有一个奇怪的行为,带有提升和作用域。
我知道“with”的使用被认为是禁忌,但在其中一个框架中遇到了这一点,不得不处理它。但尽管如此,
谁能解释为什么如果我们有一个“with”块,声明但未定义的变量是使用 with 对象解析的,但闭包变量不是这种情况。
要演示,请参阅以下代码的输出:http: //jsfiddle.net/ftK2Z/1/
var x = 90;
function test1(){
var address = {
street: 'Haight',
aptNum: 2
};
with (address){
alert(aptNum + ":" + x); // this outputs 2 : undefined.
var aptNum = 100,
x = 10 ;
}
}
用谷歌浏览器检查。
注意:我了解 JS 提升,并了解为什么在警报之后使用 var 语句是一个问题,但我想弄清楚的主要是,在警报语句的范围解析期间,'aptNum' 和 'x' 都应该是由于提升,在本地范围内未定义,因此应将它们视为“已声明但未定义”。
但是,aptNum 仍然输出为“2”。