javascript - 在 JavaScript 中,命名函数是否优于匿名函数?

标签 javascript

<分区>

Possible Duplicate:
JavaScript: var functionName = function() {} vs function functionName() {}

在 Javascript 中提取函数有两种可能的方法:

var foo = function() { ... }

这有点做作;另一种常见的模式是:

var foo = {
   baz: 43,
   doSomething: function() {
       // ...
   }
}

对比

function foo() { 
  // ... 
}

是否有明确的理由选择其中之一?

最佳答案

这一切都取决于您对函数声明位置的偏好;吊装。

函数声明和变量声明总是被 JavaScript 解释器无形地移动(“提升”)到它们包含范围的顶部。显然,函数参数和语言定义的名称已经存在。这意味着像这样的代码:

function foo() {
    bar();
    var x = 1;
}

其实是这样解释的:

function foo() {
    var x;
    bar();
    x = 1;
}

请注意声明的赋值部分没有提升。只挂了名字。函数声明不是这种情况,整个函数体也会被提升。

function test() {
    foo(); // TypeError "foo is not a function"
    bar(); // "this will run!"
    var foo = function () { // function expression assigned to local variable 'foo'
        alert("this won't run!");
    }
    function bar() { // function declaration, given the name 'bar'
        alert("this will run!");
    }
}
test();

在这种情况下,只有函数声明将其主体提升到顶部。名称“foo”被提升,但 body 被留下,在执行期间分配。

您可以为函数表达式中定义的函数命名,语法类似于函数声明。这不会使其成为函数声明,名称不会进入范围,主体也不会提升。

foo(); // TypeError "foo is not a function"
bar(); // valid
baz(); // TypeError "baz is not a function"
bin(); // ReferenceError "bin is not defined"

var foo = function () {}; // anonymous function expression ('foo' gets hoisted)
function bar() {}; // function declaration ('bar' and the function body get hoisted)
var baz = function bin() {}; // named function expression (only 'baz' gets hoisted)

foo(); // valid
bar(); // valid
baz(); // valid
bin(); // ReferenceError "bin is not defined"

因此,如果您希望将函数提升到顶部,请使用函数声明,否则使用表达式。我更喜欢后者,因为我通常使用 函数表达式 的方法构建对象文字。

命名函数表达式在抛出错误时可以派上用场。控制台将告诉您函数是什么,而不是声明anonymous 又名堆栈跟踪

关于javascript - 在 JavaScript 中,命名函数是否优于匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081593/

相关文章:

javascript - 从字符串中提取泛型类型参数

javascript - 如何检索本地存储中存储的值?

JavaScript RegEx - 带通配符的最小字符数

javascript - 如何将 ascii 正方形螺旋打印到控制台

javascript - 无法将Bootstrap JS加载到Electron应用程序中

javascript - 在客户端 JavaScript 上保存 .xml

javascript - 根据内容将div的innerHTML替换为相同的类

javascript - 计算 .load 上的两个持久引导选择值

javascript - 保存使用 Fabric.js 创建的 Canvas

javascript - 无法让javascript输出简单的加法结果