一、 在es6之前,
函数的形参当没有传值时,使用默认值会比较麻烦。
function sum(a, b, c) {
return a + b + c;
}
console.log(sum(10, 1, 2)); //13
console.log(sum(11, 1, 2)); //14
这里形参b,形参c,想让b默认值传1,c默认值传2;在使用时还要写两遍。
还有一种书写方式(这种方式使用起来很优雅,但函数在书写时也是很麻烦的):
function sum(a, b, c) {
b = b === undefined && 1;
c = c === undefined && 2;
return a + b + c;
}
console.log(sum(10)) //13
console.log(sum(11)) //14
二、 es6给出了新的方法
在书写形参时,直接给形参赋值,赋的值即是默认值。这样一来,当调用函数时,如果没有给对应的参数赋值(给它的值是undefined),则自动使用默认值
// function sum(a, b = 1, c = 2) {
// return a + b + c;
// }
// console.log(sum(10)) //13
// console.log(sum(11)) //14
// console.log(sum(10, undefined, undefined)) //13
// console.log(sum(1, undefined, 5)) //7
函数的默认形参也可以是一个表达式
/**
*创建一个元素
* @param {*} name 元素的名称
* @param {*} container 元素的父元素
* @param {*} content 元素的内容
*/
// function createElement(name, container, content) {
// const ele = document.createElement(name)
// if (content) {
// ele.innerHTML = content;
// }
// container.appendChild(ele);
// }
// createElement("div", document.getElementById("container"), "好好练习一下")
在这个例子中,我们可以直接写作:
// function createElement(name = "div", container = document.getElementById("container"), content = "") {
// const ele = document.createElement(name)
// if (content) {
// ele.innerHTML = content;
// }
// container.appendChild(ele);
// }
// createElement(undefined, undefined, "好好练习一下")
创建的元素是div,父元素用document.getElementById("container")
,方式获得是常用的场景,这样,书写为函数默认形参方便很多。
又及
1 严格模式下arguments和形参是脱离的,非严格模式下是关联的
function test(a, b) {
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);
a = 3;
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);
}
test(1, 2);
此时是关联的,当形参a被赋值为3,arguments里第一位被关联为3;
使用严格模式:
"use strict"
function test(a, b) {
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);
a = 3;
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);
}
test(1, 2);
它们不再关联。
在es6中只要给函数加上参数默认值,该函数会自动变为严格模式下的规则,arguments和形参脱离
例如:
function test(a, b = 1) {
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);
a = 3;
console.log("arguments", arguments[0], arguments[1]);
console.log("a:", a, "b:", b);
}
test(1, 2);
2. 形参和es6中的let或const声明一样,具有作用域,并且根据参数的声明顺序,存在暂时性死区
例如下面这段代码会报错:
function test(a = b, b) {
console.log(a, b);
}
test(undefined, 2);