代码是:
with(location)
{
var url=href+"aaa";
}
alert(url);
变量url
在with
中声明,但它可以访问外部,为什么?
答案 0 :(得分:4)
因为var url;
被提升到功能块的顶部。 JavaScript没有块级范围,只有闭包级(函数)。
答案 1 :(得分:2)
请参阅此答案:https://stackoverflow.com/a/185283/548696
问题在于,此块中定义的变量是限定为此块的(仅在with
之后将包含的对象)。
要实现块级范围,请执行以下操作:
with({"url": href+"aaa"}) {
// url is available here
}
alert(url); // but not here
或者更确切地说使用let
statement,因为with
被认为是有害的:
let (url = href + "aaa"){
// url available here
}
// but not here
答案 2 :(得分:2)
在JavaScript中,没有块级范围;只有功能级别的范围。拿这两个例子:
if (true) {
var a = 5;
}
alert(a); // 5
// ...
function foo() {
var a = 5;
}
foo();
alert(a); // ReferenceError: a is not defined