Javascript - 为什么全局变量隐藏在整个(函数体)函数中?

Ala*_*uno 2 javascript scope global-variables object

我理解它是如何工作的(局部函数和全局函数之间的差异),但是我还没有完全理解隐藏函数中的全局变量,而"本地"变量尚未定义或初始化的理由.

var scope = "global";
function checkscope() {
    console.log(scope);
}
//this returns >> undefined
Run Code Online (Sandbox Code Playgroud)

我正在阅读"Javascript:The Definitive Guide(第6版)",我在这里谈论第3.10章.(确切地说是第54页).

2页后,在第56页,该书说:

"在非嵌套函数中,作用域链由两个对象组成.第一个是定义函数参数和局部变量的对象,第二个是全局对象."

这是不是意味着全局变量,全局对象的"属性"都在非嵌套函数的范围链中?这与2页之前的说法相矛盾吗?

我不是最能用语言表达自己的,所以我希望你们能理解,而且,英语不是我的母语,所以我很抱歉,如果这只是对我的文本含义的误解.

Fab*_*tté 9

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

var scope = "global";
function checkscope() {
    console.log(scope);
    var scope;
    console.log(scope);
}
Run Code Online (Sandbox Code Playgroud)

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

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

由于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"
}
Run Code Online (Sandbox Code Playgroud)

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

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