3
<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,为什么它仍然显示正确的结果,而不是像“未定义”这样的东西?

4

4 回答 4

2

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

于 2013-07-03T04:06:00.650 回答
2

它是 JavaScript 作用域和提升机制。看看这个。由于提升,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); }

于 2013-07-03T04:06:49.543 回答
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仍然暴露在范围内,因为它还没有被垃圾收集器销毁(类似于闭包的工作方式)。

于 2013-07-03T04:27:42.183 回答
1

因为saysAlert是一个函数,它仅在您返回saysAlert哪所房子时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>

您的原始代码

<script type="text/javascript">   
function sayAlice() {
  var sayAlert = function() { console.log(alice); } // function sayAlert is not yet implemented
  var alice = 'Hello Alice';
  return sayAlert; // function alert is implemented after the alice variable is define
 }
 sayAlice()();
 </script>
于 2013-07-03T04:05:35.097 回答