通过分配给变量而创建的函数?

Javascript; functions created by assigning to a variable?

本问题已经有最佳答案,请猛点这里访问。

想得到一些关于这个的信息。在编写javascript时,我习惯于创建如下函数:

1
2
3
function firstThing() {
    console.log("first");
};

我正在学习一个教程,并看到了这个设置。使用变量赋值,然后传递匿名函数,然后…成为函数名。有没有理由用这种方法来代替上面的"传统"方法?

1
2
3
var secondThing = function() {
    console.log("second");
};

叫他们是一样的:

1
2
firstThing()
secondThing()


这称为函数表达式:

1
var foo = function() {}

这是一个函数声明:

1
function foo() {}

一个主要的区别是函数声明是"提升"的。在幕后,一个函数声明被"提升"到其作用域的顶部,并被分配给一个变量名——实际上与一个函数表达式相同。

考虑一下:

1
2
3
4
foo(); //logs 'abc'
function() {
  console.log('abc');
}

这样做很好,因为foo将被提升。对于函数表达式,这将失败:

1
2
3
4
foo(); //foo is not defined!
var foo = function() {
  console.log('abc');
}

函数表达式最棒的一点是,您可以用一个IIFE(立即调用的函数表达式)分配它们的值,并具有如下私有值和函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var myFunc = (function() {
  function thisWillBeMyFunc() {
    doOne();
    doTwo();
    doThree();
  }

  function doOne() {
    console.log('Action 1!');
  }
  function doTwo() {
    console.log('Action 2!');
  }
  function doThree() {
    console.log('Action 3!');
  }

  return thisWillBeMyFunc;
}());

myFunc(); //logs the actions

doOne(); //error - not defined!

现场演示(点击)。

哦,JavaScript的强大功能和灵活性!


还有另一个区别。第一个选项创建命名函数,第二个选项创建匿名函数。

当您查看堆栈跟踪时,第二个选项将显示为匿名函数,第一个选项将显示为命名函数。您可以看到第一种方法如何在调试时为您提供一些洞察力。

这里和这里有更多的参考资料。