我理解它是如何工作的(局部函数和全局函数之间的差异),但是我还没有完全理解在函数中隐藏全局变量的原理,而“本地”变量尚未定义或初始化。
var scope = "global";
function checkscope() {
console.log(scope);
}
//this returns >> undefined
我正在阅读“Javascript:The Definitive Guide(第6版)”,我在这里谈论第3.10章。 (确切地说是第54页)。
2页后,在第56页,这本书说:
“在非嵌套函数中,作用域链由两个对象组成。第一个是定义函数参数和局部变量的对象,第二个是全局对象。“
这是不是意味着全局变量,全局对象的“属性”都在非嵌套函数的作用域链中?这与2页之前的说法相矛盾吗?
我不是最善于用语言表达自己,所以我希望你们明白,而且,英语不是我的母语,所以如果这只是对我文本含义的误解,我深表歉意。
答案 0 :(得分:9)
根据评论,有问题的代码是:
var scope = "global";
function checkscope() {
console.log(scope);
var scope;
console.log(scope);
}
这将记录undefined
两次,因为var
声明(以及函数声明)是hoisted up到当前范围的顶部。上面的脚本被解释为:
var scope = "global";
function checkscope() {
var scope; //declaration hoisted up to top of scope
console.log(scope);
console.log(scope);
}
由于checkscope
有一个本地scope
变量,本地scope
变量shadows是外部范围的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
变量将保持阴影,除非你重命名它。据我所知,没有标准化的方法来访问父作用域执行上下文的阴影属性(变量/函数)。