变量范围拼图,为函数内部声明的变量打印undefined

时间:2014-05-28 20:52:14

标签: javascript scope

var a = 2;
var b = function(){
    console.log(a);
    var a = 1;
};
b();

当我调用b时,它会打印undefined。是什么原因?

3 个答案:

答案 0 :(得分:2)

在函数内部,var声明一个函数范围的变量。这意味着它对功能可见。 整个功能。这意味着您在为变量赋值之前打印出变量。

var a = 123;
(function () {
    a = 456;         // Changes the function's "a"
    console.log(a);  // Outputs the function's "a": 456
    var a;           // At compile-time, declares a function variable named "a".
})();
console.log(a);      // Outputs the global "a": 123

沿着同一条线,重复声明不会做任何事情。以下打印出123

(function () {
   var a = 123;
   var a;
   console.log(a);  // 123
})();

答案 1 :(得分:1)

代码中的var a变量声明,它声明了包含其函数范围内的变量。由于变量提升,变量声明(如var a被提升到其包含函数的顶部。当任何声明被悬挂时,该变量的赋值 not 悬挂,因此,您的代码相当于:

var a = 2;
var b = function(){
    var a; // hoisted declaration; declares `a` within this function scope
    console.log(a);
    a = 1; // not-hoisted assignment
};
b();

由于声明的变量为undefined,因此在给定值之前,此代码会记录undefined

答案 2 :(得分:0)

你有这个:

var a = 2;
var b = function(){
    console.log(a);
    var a = 1;
};

在运行期间,它变为:

var a = 2, b;
b = function(){
    var a; // new variable declaration with no value assigned
    console.log(a); // You used it new "a" without assigning any value
    a = 1;
};

在函数内部,a是一个新变量,因为var关键字,而JS正在考虑这个新的a帐户,这是未定义的全局{{1} }}。具有相同名称的拖曳变量,一个在函数外部(在全局范围内),另一个在函数内部。由于函数内部有一个新变量,因此它在a中使用但没有赋值。

您可以在console.log(a)上阅读JavaScript Scoping and Hoistingvar