Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在if语句中放置函数语句_Javascript - Fatal编程技术网

Javascript 在if语句中放置函数语句

Javascript 在if语句中放置函数语句,javascript,Javascript,我听说,在JavaScript上下文中,将函数语句放在if语句中是一种不好的做法。为什么会这样?这是一种糟糕的做法,因为函数声明被“提升”到词法范围的顶部,而不管您的代码是否进入if语句的该部分 例如: var someFunction = function () { var num = 5; if ( num !== 5 ) { function anotherFunction () { console.log( 'hello there' ); }

我听说,在JavaScript上下文中,将函数语句放在if语句中是一种不好的做法。为什么会这样?

这是一种糟糕的做法,因为函数声明被“提升”到词法范围的顶部,而不管您的代码是否进入
if
语句的该部分

例如:

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

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

  anotherFunction();
};

someFunction(); // logs out 'hello there'
尽管
另一个函数
似乎是在
if
语句中声明的,但这对JavaScript引擎来说并不重要,因为所有函数声明都被提升到词法范围的顶部(在本例中,提升到
someFunction
函数的词法范围的顶部)。这就是为什么可以在
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”,但第二个场景记录“bye bye”的原因是JavaScript引擎将所有函数声明提升到词法范围的顶部。当它提升第一个函数声明时,标识符'anotherFunction'引用带有'hello there'的函数对象。但是,当它提升第二个函数声明时,它只是将另一个函数对象(带有“bye-bye”的对象)分配给现有的标识符
另一个函数


您可以看到这是多么误导和混乱,因为它违背了您的期望。

这是一种糟糕的做法,因为函数声明被“提升”到词法范围的顶部,而不管您的代码是否进入
if
语句的该部分

例如:

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

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

  anotherFunction();
};

someFunction(); // logs out 'hello there'
尽管
另一个函数
似乎是在
if
语句中声明的,但这对JavaScript引擎来说并不重要,因为所有函数声明都被提升到词法范围的顶部(在本例中,提升到
someFunction
函数的词法范围的顶部)。这就是为什么可以在
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”,但第二个场景记录“bye bye”的原因是JavaScript引擎将所有函数声明提升到词法范围的顶部。当它提升第一个函数声明时,标识符'anotherFunction'引用带有'hello there'的函数对象。但是,当它提升第二个函数声明时,它只是将另一个函数对象(带有“bye-bye”的对象)分配给现有的标识符
另一个函数


您可以看到这是多么令人误解和困惑,因为它违背了您的期望。

请注意,将形式为
someVariable=function(){}
(不是函数语句)的函数声明放在if块中是可以的。(在这种情况下,
someVariable
应该在if语句之前的某个地方声明。)请给出一个代码示例。@nnnnnn我同意您的看法,尽管您描述的场景通常不称为函数声明。相反,它通常被称为创建函数表达式。@wmock-True。实际上,我想用的词是“定义”(但我现在无法编辑该评论)。函数由您所说的函数表达式定义,然后(在我的示例中)分配给前面声明的变量。请注意,将形式为
someVariable=function(){}
(不是函数语句)的函数声明放在if块中是可以的。(在这种情况下,
someVariable
应该在if语句之前的某个地方声明。)请给出一个代码示例。@nnnnnn我同意您的看法,尽管您描述的场景通常不称为函数声明。相反,它通常被称为创建函数表达式。@wmock-True。实际上,我想用的词是“定义”(但我现在无法编辑该评论)。正如您所说,函数是由函数表达式定义的,然后(在我的示例中)分配给前面声明的变量。解释得很好。谢谢我的印象是,唯一被提升的是一个变量,其函数名的值为“undefined”,而实际的函数体直到后来才分配给该名称。但是——如果我理解正确的话——被提升的是整个函数语句。函数声明被完全提升(实际的函数对象和标识符)。变量声明只使用标识符和值
undefined
。很好的解释。谢谢我的印象是,唯一被提升的是一个变量,其函数名的值为“undefined”,而实际的函数体直到后来才分配给该名称。但是——如果我理解正确的话——被提升的是整个函数语句。函数声明被完全提升(实际的函数对象和标识符)。变量声明只使用标识符和值
undefined
来提升。