1变量,常量的区别;
常量与变量的区别
常量与变量的存储方式是一样的,只不过常量必须要有初始值,而且值不允许被修改,而变量可以无初始值,且可以多次赋值。
常量与字面量的区别
常量与字面量均不会被改变,常量为存储数据的容器,而字面量为等号右侧的值,字面量是由字符串,数字等构成的字符串或数值。
2. 函数的种类与参数类型
函数一共有7种,分别是正比例函数、反比例函数、一次函数、二次函数、三角函数、三角函数、对数函数。
必须参数,默认参数,可变参数(不定长参数),关键字参数,组合参数
,
3. 作用域与闭包的关系与实现
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>作用域/作用域链/闭包</title>
</head>
<body>
<script>
// 作用域: 全局作用域, 函数作用域, 块作用域(先忽略)
// 函数外面: 全局作用域
let username = "猪老师";
function demo1() {
// 函数作用域
// console.log(username);
let username = "欧阳老师";
console.log(username);
// username,先在函数内部查询,如果有就直接访问
// 如果没有, 就向上一个作用域查询,一级一级向上,直到全局
// 全局有username,查询成功,返回 undefiend
// 作用域链, 查询变量用的
let email = "a@php.cn";
}
demo1();
// console.log(email);
// 作用域是单向的
// 由外向内传递可以, 但是由内向外禁止
// 闭包
// 二个条件
// 1. 父子函数
// 2. 自由变量
// 父函数
function parent(a) {
// 子函数
function f(b) {
// b 外部参数
// c 是私有变量
// b,c 都是当前子函数 f 自有变量
let c = 6;
// a = 5;
// b = 8;
// c = 6;
// a : 是子函数 f 的自由变量
return a + b + c;
}
// 返回
return f;
}
// 这个时候,在外部调用parent()会返回 一个函数,此时闭包就产生了
// console.log(parent(5));
// parent()调用结束,应该将空间和参数全部释放
// 但是父函数parent中的一个变量a,被 它的一个子函数正在引用着,所以不能销毁
// const f1 = parent(5);
// console.log(f1);
// console.log(f1(8));
// 经典应用, 通常与IIFE立即执行函数配合
let counter = (function (n) {
// 子函数
// n: 自由变量, 它不属于子函数
return function () {
// 子函数自有变量只能有二种
// 1. 外部参数, 2. 自己声明的变量
return n++;
};
})(5899);
console.log(counter());
console.log(counter());
console.log(counter());
console.log(counter());
console.log(counter());
console.log(counter());
console.log(counter());
</script>
</body>
</html>
4. [可选]模板字符串与标签函数的使用方式
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>模板字符串</title>
</head>
<body>
<script>
console.log("hello");
let lang = "html\n" + "css\n" + "js";
console.log(lang);
let a = 10,
b = 20;
let res = a + " + " + b + " = " + (a + b);
console.log(res);
// 传统字符串, 多行和表达式变量的混写非常的麻烦
// es6使用模板字符串, 可以解决
// 使用反引来来声明, 不用引用
// 反引号 ` , 在 esc 键下面
lang = `hello`;
console.log(lang);
lang = `html
css
js`;
console.log(lang);
// 使用 ${...} 插值占位符,可以将变量或表达式嵌入到字符串
res = `${a} + ${b} = ${a + b}`;
console.log(res);
// 标签函数, 使用模板字符串为参数的函数
// alert`hello ${10} ${20} ${30} world`;
// console.log`hello ${10} ${20} ${30} world`;
// 标签函数(第一个参数是字符串字面量组成的数组,从第二个参数起, 是插值表达式)
// num: 数量
// pricce: 单价
function total(num, price) {
console.log(num * price);
}
// total(10, 90);
// 这样的调用是不是很"萌"
total`数量: ${10} 单价: ${90}`;
function total(strings, num, price) {
console.log(strings);
console.log(num, price);
// console.log(num * price);
let res = `${strings[0]}${10}${strings[1]}${90}, 总金额: ${num * price} 元`;
console.log(res);
}
// 模板字符串参数中的占位符比较多,可以用rest进行归并
sum`计算多个数之和: ${5}${6}${7}${8}${9}`;
function sum(strings, ...args) {
console.log(`${args.join()}之和是 ${args.reduce((p, c) => p + c)}`);
}
// 模板字符串: 可以使用插值表达式的字符串
// 标签函数: 可以使用"模板字符串"为参数的函数
// 标签函数,就是在"模板字符串"之前加一个标签/标识符,而这个标签,就是一个函数名
// 标签函数的参数是有约定的, 不能乱写, 第一个是字面量数组,从第二起才是内部的占位符参数
</script>
</body>
</html>