函数
避免使用 arguments.callee 和 arguments.caller
function foo (n) {
if (n <= 0) return
arguments.callee(n - 1) // ✗ 错误
}
function foo (n) {
if (n <= 0) return
foo(n - 1)
}
不要定义冗余的函数参数
function sum (a, b, a) { // ✗ 错误
// ...
}
function sum (a, b, c) { // ✓ 正确
// ...
}
避免多余的函数上下文绑定
const name = function () {
getName()
}.bind(user) // ✗ 错误
const name = function () {
this.getName()
}.bind(user) // ✓ 正确
不要使用 eval()
eval( "var result = user." + propName ) // ✗ 错误
const result = user[propName] // ✓ 正确
不要使用多余的括号包裹函数
const myFunc = (function () { }) // ✗ 错误
const myFunc = function () { } // ✓ 正确
避免对声明过的函数重新赋值
function myFunc () { }
myFunc = myOtherFunc // ✗ 错误
注意隐式的 eval()
setTimeout("alert('Hello world')") // ✗ 错误
setTimeout(function () { alert('Hello world') }) // ✓ 正确
嵌套的代码块中禁止再定义函数
if (authenticated) {
function setAuthUser () {} // ✗ 错误
}
禁止使用 Function 构造器
const sum = new Function('a', 'b', 'return a + b') // ✗ 错误
禁止使用 Object 构造器
let config = new Object() // ✗ 错误
自调用匿名函数 (IIFEs) 使用括号包裹
const getName = function () { }() // ✗ 错误
const getName = (function () { }()) // ✓ 正确
const getName = (function () { })() // ✓ 正确
不使用 Generator 函数语法
使用
Promise
或者async functions
来实现异步编程
function* helloWorldGenerator() { // ✗ 错误
yield 'hello';
yield 'world';
return 'ending';
}