【问题标题】:Why is this function yielding 'undefined'?为什么这个函数会产生“未定义”?
【发布时间】:2017-02-26 12:09:34
【问题描述】:

这是我遇到的一个非常令人困惑的行为,我无法弄清楚:

var foo = 'outside';

function logIt(){

   console.log(foo); 
   var foo = 'inside';

} 

logIt();

这将产生 undefined。这对我来说已经无法解释了。但更奇怪的是:

var foo = 'outside';

function logIt(){

   console.log(foo); 

} 

logIt();

实际上会产生外部

为什么会这样?

【问题讨论】:

标签: javascript function scope var


【解决方案1】:

Variable hoisting

因为变量声明(以及一般的声明)是 在执行任何代码之前处理,在任何地方声明一个变量 在代码中相当于在顶部声明。

因此您的代码相当于:

var foo = 'outside';

function logIt(){
   var foo;
   console.log(foo); 
   foo = 'inside';
} 

logIt();

在调用console.log 时,foo undefined

【讨论】:

    【解决方案2】:

    这与 Javascript 中的提升变量有关。

    var foo = 'outside';
    
    function logIt(){
    
       console.log(foo); 
       var foo = 'inside';
    } 
    
    logIt();
    

    内部会变成:

    var foo = 'outside';
    
    function logIt(){
       var foo;
       console.log(foo); 
       foo = 'inside';
    } 
    
    logIt();
    

    因此, foo 将在 console.log 中为 undefined :-)

    【讨论】:

      【解决方案3】:

      您正在寻找 hoisting 在 javascript 上

      当你写这个时:

      var foo = 'outside';
      
      function logIt(){
      
         console.log(foo); 
         var foo = 'inside';
      
      } 
      
      logIt();
      

      javascript 会这样解释代码:

      var foo = 'outside';
      
      function logIt(){
         var foo; //undefined
         console.log(foo); 
         foo = 'inside';
      
      } 
      
      logIt();
      

      logIt() 中的fooconsole.log(foo) 之前声明为undefined,这就是它未定义的原因。

      在第二个示例中,console.log(foo) 在您声明全局 var foo = 'outside' 之后运行,这就是它打印 outside 的原因。

      【讨论】:

        【解决方案4】:

        正如其他人正确提到的,这是因为吊装。

        提升(对于许多开发人员而言)是 JavaScript 的一种未知或被忽视的行为。 如果开发人员不了解提升,程序可能包含错误(错误)。 为避免错误,请始终在每个作用域的开头声明所有变量。

        所以在你的例子中应该是这样的:

        function logIt(){ foo = 'inside'; console.log(foo); }

        logIt();

        为了预期的结果。

        【讨论】:

          猜你喜欢
          • 2014-04-11
          • 1970-01-01
          • 1970-01-01
          • 2016-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-29
          • 1970-01-01
          相关资源
          最近更新 更多