我正在学习javascript,我的问题几乎不能在任何地方使用,但面试目的我想明白这一点。下面是代码。第一个警报提醒'未定义',第二个是'4'。第二个是可以理解的。我想知道为什么第一个警报没有警告'5'并且未定义?什么背后的概念一样? 感谢。
var x = 5;
function check(){
alert(x);
var x = 4;
alert(x);
}
check();
答案 0 :(得分:10)
var
始终被提升(移动)到范围的开头。您的代码等同于:
var x = 5;
function check(){
var x;
alert(x);
x = 4;
alert(x);
}
check();
正如您可以清楚地看到的那样,本地x
隐藏了全局x
,即使本地的undefined
还没有值(因此第一个提醒显示var
)。
一点额外:条件或其他块不会影响提升var x = 1;
(function() {
x = 3;
if (false) {
var x = 2; // var will be moved to the begining of the function
}
})()
console.log(x) // 1
声明。
{{1}}
答案 1 :(得分:1)
JavaScript有一些概念需要一点点习惯,有时候看似简单问题的答案很长,但我会尽量快速简洁。
在JavaScript中,变量由函数确定范围,并且您有两个地方可以将变量作为范围(具有上下文)“全局”或“本地”。 Web浏览器中的全局上下文是“窗口”,因此在代码示例中var x = 5;
是一个全局变量。代码中的本地上下文位于检查函数中,因此var x = 4;
是检查函数的局部变量。如果你有更多的函数,那么它们将拥有自己的函数作用域(context)等等。如果在函数内部声明变量时忘记单词“var”,它将成为一个“全局”变量,请注意。现在我们已经将“全局”,“本地”范围缩小到了Javascript程序运行之前的情况吗?
在执行代码之前,Javascript引擎会发生一些事情,但我们只会看看变量会发生什么。变量被称为“悬挂”到其功能上下文或范围的顶部。这意味着变量声明被'提升或移动到顶部并分配值'undefined'但未初始化初始化保持在它们所在的相同位置。此提升还使变量在其定义的函数内可用。
所以它看起来像这样:
//to be accurate this is hoisted to its functional scope as well
var x;
x = 5;
function check() {
//declaration of 'x' hoisted to the top of functional scope,
//and assigned undefined
var x;
//this will alert undefined
alert(x);
//initialization of variable remains here
x = 4;
//so after the initialization of 'x' this will alert 4
alert(x);
}
check();
快乐编码!!!
暂且不说:他们有一个名为'let'的新功能,您可以实现添加块级范围,我相信EMCAScript 6但是尚未在所有浏览器中实现,所以这就是为什么我把它放在一边。