试图理解一些与js中的变量声明相关的代码

时间:2013-07-03 04:03:13

标签: javascript

<script type="text/javascript">   
function sayAlice() {
  var sayAlert = function() { console.log(alice); }
  var alice = 'Hello Alice';
  return sayAlert;
}
sayAlice()();
</script>

在控制台中,它会显示Hello Alice

问题:

var alice(变量声明)在var sayAlert之后,为什么它仍然显示正确的结果,而不是'undefined'?

4 个答案:

答案 0 :(得分:2)

因为当sayAlert实际执行时(在sayAlice()()来电中),Hello Alice已分配给alice。由于JavaScript中的闭包,alice在执行时可用sayAlert

答案 1 :(得分:2)

这是JavaScript范围和提升机制。 看看this。由于提升,javascript会像这样解释您的脚本:

<script type="text/javascript">   
   function sayAlice() {
      var alice;
      var sayAlert = function() { console.log(alice); }
      alice = 'Hello Alice';
      return sayAlert;
    }
    sayAlice()();
</script>

var alice;声明之前var sayAlert = function() { console.log(alice); } 悬挂

答案 2 :(得分:1)

因为saysAlert是一个功能而且 它仅在您返回saysAlert的{​​{1}}并且在您声明function之后才会实现。

这个会给你一个未定义的变量:

alice

您的原始代码

<script type="text/javascript">   
function sayAlice() {
var sayAlert='';
console.log(alice); // alice is undefine up to this line
var alice = 'Hello Alice';
return sayAlert;
}
sayAlice()();
</script>

答案 3 :(得分:1)

<script type="text/javascript">   
1:    function sayAlice() {
2:       var sayAlert = function() { console.log(alice); }
3:       var alice = 'Hello Alice';
4:       return sayAlert;
5:    }
6:    sayAlice()();
</script>
  • 第2行定义了一个函数sayAlert,但没有调用/执行它。如果您在结束括号(())之后放置},则日志将打印undefined,因为正如您所提到的,直到之后才定义alice

  • 第4行只返回sayAlert函数,但还没有调用它(注意它仍然没有()

  • 第6行接收先前从sayAlice()调用返回的函数,并添加()以调用返回的函数( sayAlert )。因此,在第6行运行sayAlice后,它实际上看起来像sayAlert(),当它执行时console.log(...)被调用。 alice仍然暴露在范围内,因为它尚未被垃圾收集器(类似地关闭)破坏。