作业内容:
1. 变量,常量的区别;
2. 函数的种类与参数类型;
3. 作用域与闭包的关系与实现;
4. [可选]模板字符串与标签函数的使用方式;
以上要实例演示
变量,常量的区别
常量为只读变量,且在声明时必须要初始化。代码如下:
// 声明a变量并初始化
let a = 10;
// a的值可以被更新
a = 20;
// 这句代码会报错,因为常量必须要初始化
// const B;
// 这里还有个要注意的地方,建议常量名全部用大写。当然小写也是可以的,只不过不便于区分,这也是一个良好的编程习惯
const B = 10;
// 这句代码会报错,因为常量不能被修改
// B = 20;
函数的种类与参数类型
函数一般分为:普通函数、匿名函数(一次性函数和)、
// 普通函数的声明
function add(a, b) {
console.log(a + b);
}
// 函数调用
add(10, 20);
// --------------------------------------
// 匿名函数,一次性
(function (a, b) {
console.log(a + b);
})(10, 30);
// --------------------------------------
// 声明函数变量
let add2 = function (a, b) {
console.log(a + b);
};
// 通过函数名去调用函数
add2(10, 40);
// 可以用胖简头简化
add2 = (a, b) => console.log(a + b);
add2(10, 50);
// 如果参数只有一个,括号也可以不要,但如果没有参数,括号是必须的
add2 = () => console.log("没有参数的函数简化");
add2();
// --------------------------------------
参数类型:形参和实参
- 形参是放在函数定义的时候,括号内的值,可以没有,也可以有一个或多个
- 实参是在函数调用的时候放在括号内的值,需要与对应的函数定义参数一一对应。
- 参数不足的时候,可以用默认值来代替
- 参数过多的时候,可以用…args来把所有参数压缩到一个数组里。
- 调用参数,也可以用…arr的方式来调用,这里arr可以是任意数组名。
作用域与闭包
作用域一般有:全局作用域、函数作用域和块作用域
函数体内可以访问全局作用域的变量,即映射
但函数外,则不可以访问函数内的局部变量。
// 声明全局变量a
let a = 10;
function fun1() {
// 声明函数变量b
let b = 20;
// 打印函数变量20
console.log(b);
// 打印全局变量10
console.log(a);
}
// 想要打印函数变量,失败,报错:b is not defined(b未定义)
console.log(b);
fun1();
闭包条件:一、父子函数;二、自由变量
// 父函数
function f(a) {
// 子函数
function s(b) {
let c = 6;
// 这里的a就是子函数的自由变量
return a + b + c;
}
return s;
}
console.log(f(5)(4));
// 闭包函数的经典应用: 计数器
let counter = (function (n) {
return function () {
return n++;
};
})(99);
console.log(counter());
console.log(counter());
console.log(counter());
console.log(counter());
模板字符串和标签函数
// 模板字符串的常规理解
let a = 10,
b = 20;
let str = `${a} + ${b} = ${a + b}`;
console.log(str);
// 标签函数,使用模板字符串为参数
function total(string, ...args) {
return args.reduce((p, c) => p + c);
}
// 调用的时候要用模板字符串作为参数
console.log(total`数量:${10} ${20} ${30}`);
// 打印结果:60