函数

避免使用 arguments.callee 和 arguments.caller

  1. function foo (n) {
  2. if (n <= 0) return
  3. arguments.callee(n - 1) // ✗ 错误
  4. }
  5. function foo (n) {
  6. if (n <= 0) return
  7. foo(n - 1)
  8. }

不要定义冗余的函数参数

  1. function sum (a, b, a) { // ✗ 错误
  2. // ...
  3. }
  4. function sum (a, b, c) { // ✓ 正确
  5. // ...
  6. }

避免多余的函数上下文绑定

  1. const name = function () {
  2. getName()
  3. }.bind(user) // ✗ 错误
  4. const name = function () {
  5. this.getName()
  6. }.bind(user) // ✓ 正确

不要使用 eval()

  1. eval( "var result = user." + propName ) // ✗ 错误
  2. const result = user[propName] // ✓ 正确

不要使用多余的括号包裹函数

  1. const myFunc = (function () { }) // ✗ 错误
  2. const myFunc = function () { } // ✓ 正确

避免对声明过的函数重新赋值

  1. function myFunc () { }
  2. myFunc = myOtherFunc // ✗ 错误

注意隐式的 eval()

  1. setTimeout("alert('Hello world')") // ✗ 错误
  2. setTimeout(function () { alert('Hello world') }) // ✓ 正确

嵌套的代码块中禁止再定义函数

  1. if (authenticated) {
  2. function setAuthUser () {} // ✗ 错误
  3. }

禁止使用 Function 构造器

  1. const sum = new Function('a', 'b', 'return a + b') // ✗ 错误

禁止使用 Object 构造器

  1. let config = new Object() // ✗ 错误

自调用匿名函数 (IIFEs) 使用括号包裹

  1. const getName = function () { }() // ✗ 错误
  2. const getName = (function () { }()) // ✓ 正确
  3. const getName = (function () { })() // ✓ 正确

不使用 Generator 函数语法

使用 Promise 或者 async functions 来实现异步编程

  1. function* helloWorldGenerator() { // ✗ 错误
  2. yield 'hello';
  3. yield 'world';
  4. return 'ending';
  5. }