函数声明不能​​嵌套在非函数块中

时间:2015-08-10 23:44:23

标签: javascript functional-programming

我正在阅读有关函数声明与函数表达式的内容,我无法弄清楚以下语句的含义:

  

函数声明作为独立构造出现,不可能出现   嵌套在非功能块中。

有人请用一个例子解释作者的意思,准确地说:“......不能嵌套在非功能块中。”

链接是:https://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/

4 个答案:

答案 0 :(得分:2)

我不知道作者认为它在物理上是不可能的,或者更多的不应该完成。根据我的理解,作者所说的是:

var y = true;
if (y) {
    function example() {
    alert('hi');
    return true;
   }
}

这里函数在条件语句中声明,这很好,因为 x 是真的,但是如果它是假的,那么函数永远不会被声明,当我们想要调用时示例函数什么都不会发生,因为它从未声明过。所以它应该是

function example() {
"use strict";
return true;
}
var y = true;
if (y) {
    example();
}

在上面的代码中,如果条件满足,我们仍然会调用 example 函数,但是由于示例是在条件语句之外定义的,所以无论条件语句如何,我们都可以使用它。 This Post has more information about it。希望这就是你的意思

答案 1 :(得分:2)

采用面值,声明:

  

函数声明作为独立构造出现,不能嵌套在非函数块中。

错了。可以将函数声明放在块中,如文章中的示例所示。它被警告的原因是不同浏览器的行为不同。在大多数浏览器(不是某些版本的IE和Firefox)中,无论执行是否进入块,都会声明此类函数,例如:

if (false) {
  function foo(){}
}

foo 在外部范围内声明并可用。这与变量声明完全相同:

if (false) {
  var x = 3;
}

在上文中,无论块是否被执行,都声明 x 。但是,只有在输入块时才会分配值。

回到功能。警告块中的函数声明的原因是,首先,它推断仅在输入块时才创建该函数,这对于大多数浏览器而言并非全部。其次,更重要的是,因为不同的浏览器有不同的行为。

一些有趣的读物:

另请注意,函数语句为warned against in ES5 strict mode,可能会在ECMAScript的某个未来版本中引入。

最后,此行为直接在Appendix B 3.3.3Appendix B 3.4的ECMA-262第6版中解决。

答案 2 :(得分:1)

我认为这意味着你无法在代码中任意定义函数,见下文。

if true {
  function funName(){};
}

funName在这种情况下不会是一个函数,它会导致错误。

答案 3 :(得分:1)

考虑一下简陋的if陈述:

function whatever() {
  // ...
  if (something === somethingElse) {
    function aFunction() {
      // ...
    }

    // more code ...
  }

  aFunction(5, 6, 7);

现在,那段代码很奇怪。该函数在if块内声明。但函数声明已被悬挂!那是什么意思呢?

更奇怪:如果else子句中的“aFunction”有不同的声明怎么办?

类似代码的奇怪性的一个基本方面是函数声明被视为它们出现在作用域的顶部(即它们被“悬挂”)。出于这个原因,在其他类型的块中的函数声明本质上是模糊和奇怪的。

请注意,通过函数表达式进行函数实例化并不奇怪,因为它们是作为运行代码的一部分发生的,如对象初始化表达式。

相关问题