2
4

1 回答 1

9

根据评论,有问题的代码是:

var scope = "global";
function checkscope() {
    console.log(scope);
    var scope;
    console.log(scope);
}

这将记录undefined两次,因为var声明(以及函数声明)被提升到当前范围的顶部。上面的脚本解释为:

var scope = "global";
function checkscope() {
    var scope; //declaration hoisted up to top of scope
    console.log(scope);
    console.log(scope);
}

checkscope局部scope变量一样,局部scope变量会隐藏外部范围的scope变量。

局部scope变量没有赋值,相当于 JavaScript 的原生undefined值。


旁注:如果有问题的外部范围是全局范围,在浏览器环境中,您仍然可以scope通过引用全局对象 ( window) 来访问全局变量:

var scope = "global";
function checkscope() {
    var scope; //declaration hoisted up to top of scope
    console.log(scope); //undefined
    console.log(window.scope); //"global"
}

如您所见,在全局范围内声明的变量成为window对象的属性。

当外部范围是非全局的时,这个技巧不是很有用,scope除非您重命名变量,否则该变量将保持阴影。据我所知,没有标准化的方法可以访问父作用域执行上下文的阴影属性(变量/函数)。

于 2013-05-05T02:57:24.770 回答