hanyuxinting / Blog

记录点滴
1 stars 0 forks source link

ES6标准入门第二版-函数的扩展 #13

Open hanyuxinting opened 7 years ago

hanyuxinting commented 7 years ago

函数参数的默认值

// 以前
function log(x, y) {
y = y || 'World';
console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello World

问题:y的值就是false或空的时候,被迫展示成了world。 so:

if (typeof y === 'undefined') {
y = 'World';
}

来个新的:

function log(x, y = 'World') {
console.log(x, y);
}
log('Hello') // Hello World
log('Hello', 'China') // Hello China
log('Hello', '') // Hello

此处有个坑位:

function f(x=1,y){return [x,y]}
 f(,1) // error

function f(x=1,y=2,z){return [x,y,z]} 
f(2,,1) //error

function f(x=1,y=2,z){return [x,y,z]} 
f(2,'',1) // [2, "", 1]

image

所以以上两点是不是很奇怪。。

作用域

区分以下两段代码:

// 代码1
var x = 1;
function f(x, y = x) {
console.log(y);
}
f(2)
// 代码2
let x = 1;
function f(y = x) {
let x = 2;
console.log(y);
}
f()

分析可知:代码1中调用时,入参为2,y=x,所以返回2 代码2中,调用时,只有一个全局的x有赋值,所以y就被赋值成全局x的值,在函数执行中,有了x的声明及赋值,但此时y已有值,即1。 如果全局没有声明x,那就会报错了~

死区代码写法:

var x = 1;
function foo(x = x) {
// ...
}
foo() // ReferenceError: x is not defined

默认值x的作用域是函数作用域,而不是全局作用域。由于在函数作用域中,存在变量x,但是 默认值在x赋值之前先执行了,所以这时属于暂时性死区(参见《 let 和 const 命令》一章),任何对x的操作都会报错。??

当参数是函数时:

let foo = 'outer';
function bar(func = x => foo) {
let foo = 'inner';
console.log(func()); // outer
}
bar();
function bar(func = () => foo) {
let foo = 'inner';
console.log(func());
}
bar() // ReferenceError: foo is not defined

综上:要看这个参数在函数调用时,该函数是否已形成了自己的作用域~~形成了,该参数看参照函数里的变量声明,否则不用考虑。

rest 参数

用于获取函数的多余参数,数组格式。

function add(...values) {
let sum = 0;
for (var val of values) {
sum += val;
}
return sum;
}
add(2, 5, 3) // 10
// arguments 变量的写法
function sortNumbers() {
return Array.prototype.slice.call(arguments).sort();
}
// rest 参数的写法
const sortNumbers = (...numbers) => numbers.sort();

rest参数之后不能再有其他参数了~只能是最后一个~并且函数的length 也不包括这个参数哦~

扩展运算符

也是三个点 和 rest 有毛关系?