在if语句中放置函数语句

时间:2015-01-03 22:49:16

标签: javascript

我听说它声称在if语句中放置一个函数语句在JavaScript的上下文中是不好的做法。为什么会这样?

1 个答案:

答案 0 :(得分:4)

这是一种不好的做法,因为函数声明是"悬挂"在您的代码是否进入if语句的那一部分的词汇范围 REGARDLESS 的顶部。

例如:

var someFunction = function () {
  var num = 5;

  if ( num !== 5 ) {
     function anotherFunction () {
       console.log( 'hello there' );
     }
  }

  anotherFunction();
};

someFunction(); // logs out 'hello there'

即使anotherFunctionif语句中声明看似,但这对JavaScript引擎并不重要,因为所有函数声明都被提升到顶部词法范围(在这种情况下,到someFunction函数的词法范围的顶部)。这就是为什么可以在anotherFunction语句之外调用if

在以下情况中,它变得更加麻烦:

var someFunction = function () {
  var num = 5;

  if ( num === 5 ) {
     function anotherFunction () {
       console.log( 'hello there' );
     }
  } else {
     function anotherFunction () {
       console.log( 'bye bye' );
     }
  }

  anotherFunction();
};

someFunction(); // logs out 'bye bye'

期待结果是' hello world'但这第二种情况记录的原因是再见'是因为JavaScript引擎将所有函数声明提升到词法范围的顶部。当它提升第一个函数声明时,标识符' anotherFunction'引用函数对象' hello there'。但是,当它提升第二个函数声明时,它只是将另一个函数对象(具有“再见”的对象)分配给现有标识符anotherFunction

你可以看出这是多么误导和混淆,因为它违背了你的期望。