1

我只是想知道如何正确编写ES6功能。我知道这取决于个人喜好,但是有什么优点和缺点?在ES6中定义函数的正确方法?

function foo() { 
    ... 
} 

const foo =() => { 
    ... 
}; 

const foo = function() { 
    ... 
}; 

const foo = function bar() { 
    ... 
}; 

的发现生活怎样样式指南建议后者。但是为一个函数定义两个名字对我来说没有意义。

+1

我更喜欢第一个:D –

+0

我认为可能与为每个匿名函数指定一个名称有关,以确保始终可以正确跟踪错误 – dloeda

+0

使用*命名函数表达式*,最后一个允许调试因为它实际上告诉你函数名称而不是匿名函数。 – Li357

回答

1

使用函数声明意味着你将处理function declaration hoisting,其中所有函数都在任何代码执行之前被处理,所以你可以在它们被定义之前在技术上使用它们,因为它们被提升到顶部,吨有块作用域,因为他们将功能作用域:

foo(); //can be used before declaration appears! 

function foo() { 
    { //new block 
    function bar() { 
     alert(1); 
    } 
    } 
    bar(); //no problem, is function scoped 
} 
foo(); //alerts 1! 

随着功能表达式,就没有提升,如果你使用letconst你有块作用域:

function foo() { 
    { //new block 
    const bar =() => { 
     alert(1); 
    } 
    } 
    bar(); //ReferenceError: Can't find variable: bar 
} 
foo(); 

最后,使用命名的函数表达式允许提供一个命名为函数的错误,而不是为更好的调试只是一个匿名函数。因此:更喜欢最后的选择。它期望块范围确定(它仍然有提升,但在代码中声明之前访问它是无效的),并且它允许更好的调试体验。

此外,不要忘记,箭头功能不绑定他们自己的this,但拿封闭上下文的this!函数声明始终有一个this以严格模式引用全局对象windowundefined

+1

最适合我的答案。谢谢! – Pawel

+0

请注意,当您创建一个变量时(例如'const f = function(){}';'f.name ==='f''):[“If * hasNameProperty * * rval *,GetReferencedName(* lref *))。“](https://tc39.github.io/ecma262/#sec-assignment-operators-runtime-semantics-evaluation) – towerofnix

0

第一个是避免发生相关错误的优势做hoisting,这样你就可以将其声明之前使用该功能。

有了其他选择,你可以因为在此之前,只点了声明之后使用它们。所以我会说第一个选择是最安全的。

+0

我恭敬地不同意。我只会说在声明之后使用是件好事,而函数声明是函数作用域,但带有let或const的表达式是块范围的。最后,“这个”对待的方式有很大不同。 – Li357

相关问题