js参数、返回值、模板字面量、模板函数和闭包
参数和返回值
参数
- 参数一一对应
// 1. 参数一一对应
function name(参数) {
return 返回值
}
console.log(name(值));
- 参数不足 —> 给一个默认值
function name(username = 'world'){
return 'hello.'+username;
}
console.log(name());
- 参数过多 —> …rest
‘…’ 用在函数参数中,可以将参数压缩到数组里 ; 用在函数调用,可以展开数组;
// 将多余的参数,全部压入到一个数组里
function name(...arr){
for (let item of arr){
console.log(item);
}
return arr;
}
console.log(name('张三','李四','王五'));
console.log(...['赵','钱','孙']);
返回值 默认都是单值
- 数组返回
const f = () => [1,2,3];
console.log(f());
- 对象返回
const o = () => {
return {
a:1,
b:2,
c:3,
}
}
console.log(o());
// 返回一个值,可以简写
const obj = () => ({
a:1,
b:2,
c:3,
})
console.log(obj());
对象字面量简化
对象属性,如果和外部变量同名,则可以省去值,自动用外部同名进行初始化
对象方法,将’: function’去掉,不要用箭头函数
let age = '18';
console.log(age);
let y_name = '张三';
let user ={
age,
y_name,
// 方法简写 : 将': function'去掉
getNameAge(){
return this.y_name +':'+this.age;
}
}
console.log(user.age);
console.log(user.getNameAge());
模板字面量
console.log('hello,world');
// hello,world : 字符串
// hello,username : 模板字符串
// 如果一个字符串中,存在"占位符",则成为"模板字符串"
// 占位符 : 插值/表达式/变量
// 插值之外的字符串 : 字面量
// 用反引号 : 声明模板字符串
let name = '老师';
console.log(`hello.${name}`);
模板函数/标签函数 : 使用”模板字面量”作为参数的函数
模板函数的声明与普通函数是一样的,只是调用时,使用”模板字面量”作为参数
function total(参数1, 参数2){}
参数1: 必须是当前模板字面量参数中的字符串字面量组成的数组
参数2: 第二个参数必须是一个或多个模板字面量中插值列表
function total(strings, ...args) {
console.log(strings);
console.log(args);
}
let name = '手机';
let num = 10;
let price = 500;
total`名称: ${name}, 数量:${num},单价:${price}`;
闭包
函数外部变量 : 自由变量
函数内部可用的三种变量
- 参数变量 : 函数参数列表中声明
- 私有变量 : 函数内部声明
- 自由变量 : 函数外部声明
形成闭包的条件
- 父子函数
- 子函数中调用父函数的变量
fn = function(a){
let f = function(b){
return a + b;
}
return f;
}
console.log(fn(20)(10));
应用 : 偏函数(高阶函数)
fn = function(a){
return function(b){
return function(c){
return a+b+c;
}
}
}
// 将参数分多次传入函数,柯里化
// 将后端返回的数据分块处理
console.log(fn(1)(2)(3));
代码简化 : 箭头函数
fn1 = d =>e =>f =>d+e+f;
console.log(fn1(1)(2)(3));
纯函数
将外部自由变量,通过参数传入到函数中,而不是在函数中直接引用
let a = 'hello';
let b = 'world';
function hello(c,d){
return c + d;
}
console.log(hello(a,b));