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'); } |
这样做很好,因为
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的强大功能和灵活性!
还有另一个区别。第一个选项创建命名函数,第二个选项创建匿名函数。
当您查看堆栈跟踪时,第二个选项将显示为匿名函数,第一个选项将显示为命名函数。您可以看到第一种方法如何在调试时为您提供一些洞察力。
这里和这里有更多的参考资料。