在 ES6 中,我们已经可以使用默认参数来简化函数的调用。而在 ES7 中,我们可以使用更加简洁的语法来定义默认参数。
默认参数的语法
默认参数的语法非常简单,只需要在函数的参数列表中给参数赋一个默认值即可。
function foo(a = 1) { console.log(a); } foo(); // 输出 1 foo(2); // 输出 2
在上面的代码中,我们定义了一个函数 foo
,它有一个参数 a
,并给 a
赋了一个默认值 1
。当我们调用 foo
函数时,如果没有传入参数,a
的值就会是默认值 1
。
默认参数的常见问题和错误
默认参数的作用域问题
默认参数的作用域和普通的函数参数是一样的。也就是说,如果默认参数引用了外部作用域的变量,那么在函数内部修改这个变量的值,会影响到函数外部的值。
-- -------------------- ---- ------- --- - - -- -------- ----- - -- - --------------- - ------ -- -- - - - -- ------ -- -- -
在上面的代码中,我们定义了一个变量 x
,并给它赋了一个初始值 1
。然后我们定义了一个函数 foo
,它有一个参数 a
,并给 a
赋了一个默认值 x
。在调用 foo
函数时,如果没有传入参数,a
的值就会是默认值 x
,也就是 1
。然后我们修改了变量 x
的值为 2
,再次调用 foo
函数时,a
的值就变成了 2
。
默认参数的计算问题
默认参数的值是在函数调用时计算的,而不是在函数定义时计算的。这意味着如果默认参数引用了外部作用域的变量,这个变量的值可能会发生改变,导致默认参数的值也会发生改变。
-- -------------------- ---- ------- --- - - -- -------- ----- - - - -- - --------------- - ------ -- -- - - - -- ------ -- -- -
在上面的代码中,我们定义了一个变量 x
,并给它赋了一个初始值 1
。然后我们定义了一个函数 foo
,它有一个参数 a
,并给 a
赋了一个默认值 x + 1
。在调用 foo
函数时,如果没有传入参数,a
的值就会是默认值 x + 1
,也就是 2
。然后我们修改了变量 x
的值为 2
,再次调用 foo
函数时,a
的值就变成了 3
。
默认参数与解构赋值的结合问题
在使用默认参数和解构赋值结合的时候,需要注意一些细节问题。
function foo({a = 1, b = 2} = {}) { console.log(a, b); } foo(); // 输出 1 2 foo({a: 3}); // 输出 3 2
在上面的代码中,我们定义了一个函数 foo
,它有一个参数 {a = 1, b = 2} = {}
,表示这个参数是一个对象,其中有两个属性 a
和 b
,并给它们分别赋了默认值 1
和 2
。如果没有传入参数,就使用空对象作为默认参数。在调用 foo
函数时,我们可以传入一个对象,其中可以包含属性 a
或 b
或两者都有。如果传入的对象中没有某个属性,就使用默认值。在第二次调用 foo
函数时,我们只传入了属性 a
,因此属性 b
的值就是默认值 2
。
总结
ES7 中的默认参数语法非常简单,只需要在函数的参数列表中给参数赋一个默认值即可。但是要注意默认参数的作用域问题、计算问题和与解构赋值的结合问题。如果使用不当,就可能会出现一些意想不到的错误。因此,在编写代码时一定要谨慎使用默认参数。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65d566c8add4f0e0ffd21071