var a = 2;
var b = function(){
console.log(a);
var a = 1;
};
b();
当我调用b时,它会打印undefined。是什么原因?
答案 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 Hoisting和var。