js函数作用域

var msg = 'String A';
function test() {
  alert(msg);           //undefined
  var msg = 'String A';
  alert(msg);
}
test();
 
以上代码等价于:
var msg = 'String A';
function test() {
var msg;       //函数顶部重新申明变量
alert(msg);
msg = 'String A';
alert(msg);
}
test();
在函数内部声明的变量在函数内部会覆盖掉全局同名变量。
在JS预解析时,定义变量的行为会在变量作用域内的顶部实现(hoisting),但是变量的赋值行为并不会提前,
所以第一个alert弹出的是underfined,第二个alert弹出的是”String A”。
原文地址:https://www.cnblogs.com/hubl/p/5748563.html