函数

  • 7.1 使用函数声明代替函数表达式。

    为什么?因为函数声明是可命名的,所以他们在调用栈中更容易被识别。此外,函数声明会把整个函数提升(hoisted),而函数表达式只会把函数的引用变量名提升。这条规则使得箭头函数可以取代函数表达式。

    1. // bad
    2. const foo = function () {
    3. };
    4. // good
    5. function foo() {
    6. }
  • 7.2 函数表达式:

    1. // 立即调用的函数表达式 (IIFE)
    2. (() => {
    3. console.log('Welcome to the Internet. Please follow me.');
    4. })();
  • 7.3 永远不要在一个非函数代码块(ifwhile 等)中声明一个函数,把那个函数赋给一个变量。浏览器允许你这么做,但它们的解析表现不一致。

  • 7.4 注意: ECMA-262 把 block 定义为一组语句。函数声明不是语句。阅读 ECMA-262 关于这个问题的说明

    1. // bad
    2. if (currentUser) {
    3. function test() {
    4. console.log('Nope.');
    5. }
    6. }
    7. // good
    8. let test;
    9. if (currentUser) {
    10. test = () => {
    11. console.log('Yup.');
    12. };
    13. }
  • 7.5 永远不要把参数命名为 arguments。这将取代原来函数作用域内的 arguments 对象。

    1. // bad
    2. function nope(name, options, arguments) {
    3. // ...stuff...
    4. }
    5. // good
    6. function yup(name, options, args) {
    7. // ...stuff...
    8. }

  • 7.6 不要使用 arguments。可以选择 rest 语法 ... 替代。

    为什么?使用 ... 能明确你要传入的参数。另外 rest 参数是一个真正的数组,而 arguments 是一个类数组。

    1. // bad
    2. function concatenateAll() {
    3. const args = Array.prototype.slice.call(arguments);
    4. return args.join('');
    5. }
    6. // good
    7. function concatenateAll(...args) {
    8. return args.join('');
    9. }

  • 7.7 直接给函数的参数指定默认值,不要使用一个变化的函数参数。

    1. // really bad
    2. function handleThings(opts) {
    3. // 不!我们不应该改变函数参数。
    4. // 更加糟糕: 如果参数 opts 是 false 的话,它就会被设定为一个对象。
    5. // 但这样的写法会造成一些 Bugs。
    6. //(译注:例如当 opts 被赋值为空字符串,opts 仍然会被下一行代码设定为一个空对象。)
    7. opts = opts || {};
    8. // ...
    9. }
    10. // still bad
    11. function handleThings(opts) {
    12. if (opts === void 0) {
    13. opts = {};
    14. }
    15. // ...
    16. }
    17. // good
    18. function handleThings(opts = {}) {
    19. // ...
    20. }
  • 7.8 直接给函数参数赋值时需要避免副作用。

    为什么?因为这样的写法让人感到很困惑。

    1. var b = 1;
    2. // bad
    3. function count(a = b++) {
    4. console.log(a);
    5. }
    6. count(); // 1
    7. count(); // 2
    8. count(3); // 3
    9. count(); // 3