Javascript:为什么关于警报的函数的结果是未定义的

时间:2015-09-14 17:46:24

标签: javascript

var name="Jim";
var func=function(){
   alert(name);
   var name=true;
}
func();

var name="Jim";
var func=function(){
    alert(name);
    name=true;
}
func();

两个功能有不同的结果,有人可以给我解释一下吗?

2 个答案:

答案 0 :(得分:3)

发生这种情况的原因来自hoisting。函数范围内的变量声明被提升到顶部。这意味着你的第一个功能实际上就是这个

var name="Jim";
var func=function(){
    var name;
    alert(name);
    name=true;
}
func();

这应该更清楚为什么未定义警报。

有关更深入的解释,请参阅"var hoisting"

  

因为在执行任何代码之前处理变量声明(和一般声明),所以在代码中的任何地方声明变量等同于在顶部声明它。这也意味着变量可以在声明之前使用。此行为称为“提升”,因为看起来变量声明被移动到函数或全局代码的顶部。

答案 1 :(得分:0)

您的第一个功能相当于:

var name="Jim";
var func=function(){
  var name;
  alert(name);
  name=true;
}
func();

因为变量声明总是由Javascript放在范围的开头。因此,执行alert(name)时,nameundefined

有关范围的更多信息,请参阅this answer