函数内部变量的范围和可用性

时间:2013-10-31 17:07:33

标签: javascript

我正在学习javascript,我的问题几乎不能在任何地方使用,但面试目的我想明白这一点。下面是代码。第一个警报提醒'未定义',第二个是'4'。第二个是可以理解的。我想知道为什么第一个警报没有警告'5'并且未定义?什么背后的概念一样? 感谢。

 var x = 5;
 function check(){
     alert(x);
     var x = 4;
     alert(x);
  }
 check();

2 个答案:

答案 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但是尚未在所有浏览器中实现,所以这就是为什么我把它放在一边。

相关问题