Day06 JavaScript 课堂笔记
1 回顾 数组
1. 数组
值的有序集合, 由元素组成,元素有索引和值
对象类型中的一种
2. 创建数组
[];
Array();
new Array();
3. 读写数组的元素
数组[索引]
4. 稀疏数组
5. 遍历数组
6. 数组元素的添加和删除
添加元素: 数组[数组.length]、数组.push()、数组.unshfit()、数组.splice(位置, 0, 新元素...)
删除元素: 数组.length -= n、属性.pop()、数组.shift()、数组.splice(位置,数量)
7. 多维数组
8. 字符串的数组特性
2 函数
2.1 函数概述
① 什么是函数
1. 函数是具有特定功能的代码块
2. 函数是JS中的一种数据类型,是对象类型中的一种, typeof 返回 function
② 函数的作用
1. 减少冗余代码,代码复用。
2. 实现代码模块化。
3. 封装性,让函数内部代码对外不可见。
③ 函数的组成
函数名: 本质上是变量名,命名规范同变量名命名规范。
函数体: 函数内的代码块。
参数: 写在小括号里,分为形参和实参。
返回值: 函数调用之后产生的计算结果。
2.2 声明函数的三种方式
① function 关键字方式
function 函数名([参数列表]) {
函数体语句...;
}
② 表达式方式
var 函数名 = function([参数列表]) {
函数体语句...;
}
③ Function 构造函数方式(了解)
var f01 = Function("console.log('f01 start'); console.log('f01 end');");
var f02 = Function('a', 'b', "console.log(a + '和' + b + '交朋友')");
var f03 = new Function("console.log('f01 start'); console.log('f01 end');");
var f04 = new Function('a', 'b', "console.log(a + '和' + b + '交朋友')");
2.3 函数的调用和返回值
① 函数调用
1. 函数名后面加小括号才是函数函数的调用, 函数名没有小括号就是在使用一个变量
2. 函数只有调用,函数体内的语句才会执行
3. 函数只有调用,才能得到返回值
② 返回值
1. 函数调用表达式的值就是函数的返回值
2. 如何设置函数的返回值?函数体内
① 使用关键 return,return 的右边写变量、直接量或者表达式作为返回值
② 如果 return 右边什么都没有或者return都没有,返回没有返回值; 函数调用表达式以undefined为值
3. return 可以结束函数,一旦执行到return,下面的代码就不执行了。
2.4 函数的参数
① 形参和实参
形参: 声明函数时所设置的参数,形参本质上就是个没有赋值的变量。
实参: 调用函数时所设置的参数,实参的形式可以是变量、直接量、表达式。
② 形参和实参的数量问题
1. 实参数量应与形参数量一致
2. 如果实参数量大于形参数量,多余的实参无法在函数中被使用。
3. 如果实参数量小于形参数量,后面的形参会无法被赋值,自动得到 undefined
③ 形参的默认值(可选参数)
ES5 设置形参默认值的方式:
function func(name, age) {
if (age === undefiend) {
age = 默认值;
}
}
ES6 设置形参默认值的方式:
function func(name, age=默认值) {
}
总结:
1. 实参按照顺序给形参进行赋值。
2. 有默认值的参数一定放在后面,才有意义。
3. 把有默认值的参数称为可选参数。
④ arguments
1. 获取实参的值,除了使用形参,还可以使用 arguments, arguments 能够获取所有的实参。
2. arguments 是一个伪数组,里面的元素有所有的实参组成,通过索引获取到每个实参,具有 length 属性
3. arguments 只能在函数内使用。
4. 利用arguments,可以实现可变参数数量的函数
function sum() {
var res = 0;
for (var i = 0; i < arguments.length; i ++) {
res += arguments[i];
}
return res;
}
2.5 作用域
① 变量的作用域
作用域指变量的作用范围,变量只在自己的作用范围内使用。
根据变量的作用域范围,可以把变量分为全局变量和局部变量。
1. 全局变量, 在函数外面声明的变量就是全局变量,作用域是全局的。
2. 局部变量, 在函数内声明的变量就是局部变量,作用域是所在的函数。
注意: 函数中的形参也是局部变量,作用域是所在的函数!
② 作用域链
1. 函数体语句内还可以声明函数,函数的嵌套形成了作用域链
2. 作用域链用来描述变量的查找过程:
① 当使用某个变量的时候,先从本作用域中查找,本作用域有声明该变量就直接使用,如果本作用域没有,取上一级作用域中查找
② 上一级若找到,就使用并停止查找,否则继续向上查找,直到全局作用域,哪里找到哪里停止。
③ 如果全局作用域中还没有,报错 not defined
3. 从声明变量的角度:
① 变量可以在本作用域或下级作用域使用
② 变量不能在上一级作用域使用。
作用域只与声明函数的位置有关,与调用函数的位置无关!
2.6 变量提升
① 变量提升
1. 代码正式执行之前,进行预处理。 预处理的时候会查找代码中的变量声明语句(var 关键字), 提前创建好变量,但是没有赋值。
2. 代码正式执行到变量声明语句,仅仅进行赋值操作。
3. 变量提升会将变量的声明提升到所在作用域的最前面,但是只提升声明不提升值!
② 函数提升
1. function 关键字方式创建的函数,在预处理阶段,声明和值一起提升。
2. 正式执行代码的时候,执行到 function 关键字函数声明语句,直接跳过。
3. 表达式方式创建函数,提升方式与普通变量一样,只提升声明不提升值。
2.7 匿名函数
1. 匿名函数就是没有名字的函数,就是函数直接量
2. 匿名函数主要用于立即执行函数和回调函数
(function() {
console.log('啊,我是匿名函数');
});
var fn = function() {
}
2.8 自调用函数 (IIFE 立即执行的函数)
1. 自调用函数也叫立即执行的函数,函数声明完立即被调用, 只被调用一次。
2. 自调用函数作用是为了形成一个作用域,避免全局变量污染。
(function() {
console.log('hello,匿名自调用函数!');
})();
(function func() {
console.log('啊,我是 func');
})();
|