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

Javascript—为什么全局变量隐藏在函数的整个(主体)中?,javascript,object,global-variables,scope,Javascript,Object,Global Variables,Scope,我了解它是如何工作的(局部函数和全局函数之间的差异),但我不太明白在“局部”变量尚未定义或初始化的情况下,将全局变量隐藏在函数中的原理 var scope = "global"; function checkscope() { console.log(scope); } //this returns >> undefined 我正在读“Javascript:权威指南(第6版)”,这里我要讲的是第3.10章。(准确地说是第54页) 2页之后,在第56页,书中写道: 在非嵌套函

我了解它是如何工作的(局部函数和全局函数之间的差异),但我不太明白在“局部”变量尚未定义或初始化的情况下,将全局变量隐藏在函数中的原理

var scope = "global";
function checkscope() {
    console.log(scope);
}
//this returns >> undefined
我正在读“Javascript:权威指南(第6版)”,这里我要讲的是第3.10章。(准确地说是第54页)

2页之后,在第56页,书中写道:

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

这难道不意味着全局变量、全局对象的“属性”在非嵌套函数的作用域链中吗?这与2页之前所说的不矛盾吗


我不是最擅长表达自己的人,所以我希望你们能理解,此外,英语不是我的母语,如果这只是我对文本含义的误解,我深表歉意。

根据评论,问题代码是:

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
变量将保持阴影,除非重命名它。据我所知,没有标准化的方法来访问父作用域执行上下文的隐藏属性(变量/函数)。

我不明白。在代码示例中,
范围
不会是未定义的。内部变量作用域能够引用其外部作用域的变量的能力是词法作用域的工作方式。您的示例显示“全局”正确。Javascript第54页:最终指南有完全相同的代码(添加了两行声明局部值,然后再次记录)。它还直截了当地说:“您可能认为函数的第一行将打印“全局”,因为声明局部变量的var语句尚未执行。”在这一行后面是“console.log(scope);它有注释//打印“undefined”,而不是“global”“@AlainBruno,就是这个名字。谢谢你的解释,这很有帮助。
var scope = "global";
function checkscope() {
    var scope; //declaration hoisted up to top of scope
    console.log(scope); //undefined
    console.log(window.scope); //"global"
}