【问题标题】:Simultaneously Declaring Variables and Functions in JavaScript在 JavaScript 中同时声明变量和函数
【发布时间】:2015-02-26 23:01:06
【问题描述】:

谁能解释一下原因

function x() {
  console.log("Hello!");
}
var a = x;
a();
x();

生产

你好!
你好!

但是这个

var a = function x() {
  console.log("Hello!");
}
a();
x();

尝试调用函数 x 时抛出错误?第二个 x 函数不被视为提升函数吗?我在 nodejs 和浏览器中都试过了。

【问题讨论】:

  • 我认为 x 在第二个代码块中唯一可用的地方是其内部(即递归)。不知道为什么会这样......
  • 你所有的函数调用都在函数声明之后,所以这与提升无关。

标签: javascript node.js function scope


【解决方案1】:

您的第一个示例是一个函数语句,它在其包含范围内声明了一个名称。

你的第二个例子是一个命名函数表达式,它没有。

有关详细信息,请参阅here

【讨论】:

    【解决方案2】:

    您在第二个示例中拥有的是所谓的named function expression

    它的名字没有添加到包含范围,但在函数本身的范围内是可以访问的:

    var a = function x() {
      alert(x);
    };
    a();
    

    这在编写递归函数或以其他方式引用自身的函数时很有用,因为它确保名称不会因函数范围之外发生的任何事情而被破坏。

    它还允许您在不能使用函数声明的地方创建自引用函数,例如在对象字面量中:

    var myFavoriteFunctions = {
        factorial: function f(n) {
            return n === 1 ? 1 : n * f(n);
        },
        identity: function (v) { return v; }
    };
    
    console.log(myFavoriteFunctions.factorial(10));
    

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多