这两种符号在功能上是等价的。
你可以假设:
function a() {}
function b() {}
被解释为:
var a, b;
a = function a() {};
b = function b() {};
这就是为什么您不必在使用前声明(而不是定义!)。您可以在定义函数后重新分配函数,就像使用变量一样。函数像变量一样被提升,因为它们是变量(头脑=吹?好!)。
使用前声明
function a() { b(); } // using b before it's declared?
function b() {}
变成:
var a, b;
a = function a() { b(); }; // nope! b is declared, we're good
b = function b() {};
重新定义函数
function a() { alert("a"); }
a = function b() { alert("b"); }; // that's weird!
变成:
var a;
a = function a() { alert("a"); };
a = function b() { alert("b"); }; // oh, that looks normal
声明与定义
声明为:var x
。用英语:“我将使用变量x
”。
定义为:x = 5
。在英语中“变量x
现在有值5
”。
使用前声明是必需的,并且在"use strict"
. 不需要使用前定义。如果您的变量是在运行时定义的,那么您很好。
声明和var x = 5
定义也是如此,就像.function a() {}
命名函数时要小心,不要覆盖现有变量:
var a = function () { alert("a"); };
var b = function a() { alert("b"); };
a(); // prints "b"
Lint工具会对此有所了解。
何时使用哪种表示法?
我建议仅在稍后var a = function () {}
重新分配 的值时才使用函数表达式表示法 ( ) 。a
然后,函数表达式会向读者发出信号,表明它a
会被重新分配并且是有意的。
函数表达式表示法的另一个(次要)参数是像 JSLint 这样的 Lint 工具,它可能需要您在使用函数之前声明(而不是定义!)函数。如果您有具有递归定义的函数,即。a
调用b
和b
调用a
,您不能使用函数声明表示法先声明一个。
编辑注释:我对命名的匿名函数做了一些修改。在查看堆栈跟踪时,命名匿名函数会很有用。命名函数将提供更多上下文,以免它被记录为“匿名”。