函数的语法:
函数声明:(无参数无返回值)
function 函数名(){
函数体(具体要执行的代码);
}
【注】见名思意,函数名必须体现其功能。
函数调用:
格式:函数名();
作用:
* 使程序变得简短而清晰
* 有利于程序维护
* 可以提高程序开发效率
* 提高了代码的重用性(复用性)
有参数无返回值的函数
形参:形式上的参数。
【注】使用起来和普通的变量没有区别。
函数声明:(有参数无返回值)
function 函数名(形参1, 形参2...){
函数体;
}
调用函数:
格式:函数名(实参1, 实参2...);
实参:实际传入的参数。
传参:用实参给形参赋值。
封装函数步骤:
1、分析不确定值
2、将不确定值声明称形参
3、函数名和形参名都要见名思意。
return 关键字
有参数有返回值的函数:
格式:
function 函数名(形参1, 形参2...){
函数体;
return 表达式;
}
【注】return后面写什么的表达式,函数调用的结果就是return后面表达式的值。
【注】函数运行的时候,如果遇到return关键字,整个函数会终止。
认识作用域
任何程序在执行的时候都要占用内存空间内。函数调用的时候也要去占用内存空间。
垃圾回收机制:调用函数的时候,系统会分配对应的空间给这个函数使用(空间大小一般情况由这个函数里声明的变量和形参决定)。
当函数使用完毕以后,这个内存空间要释放,还给系统。
【注】在函数内部声明的变量和形参是属于当前函数的内存空间里的。
内存管理机制:在函数中声明的变量和形参,会随着函数的调用被创建,随着函数的调用结束而被销毁。
在函数中声明的变量和形参,有效范围是当前函数(当前函数的大括号),作用域,局部作用域。
就近原则:离哪个作用域近,就使用哪个作用域内的同名变量。
局部作用域:一个函数的大括号。在这个函数内部声明的变量或者形参,只能在当前函数内部使用。
全局作用域:整个页面。
递归函数
递归:(一次计算需要开多个内存)
满足以下三个特点就是递归:
1、函数自己调用自己
2、一般情况有参数
3、一般情况下有return
方法:
1. 首先去找临界值,即无需计算,获得的值。
2. 找这一次和上一次的关系
3. 假设当前函数已经可以使用,调用自身计算上一次
数组
数组:用一个变量存储一堆数据的数据结构。
数据类型:
基本数据类型
特殊数据类型
复合/引用数据类型
数组。
声明数组:
1、通过new创建数组
参数:传入任意的数据,存储到数组中。
2、省略new运算符创建数组
【注】上述两种方法,传入参数只有一个,并且是数字的时候,直接声明这么长的一个数组。
3、数组常量进行赋值。(JS一般使用中括号[]);
声明数组的方法:
var arr = new Array(100, true, "hello");
var arr = Array(100, true, "hello");
var arr = [100, true, "hello"];
声明长度为10的数组,数组中没有数据。
var arr = new Array(10);
var arr = Array(10);
数组的属性:
数组.length 返回值数组【元素】的个数。
元素:将数组存储的每一个数据,叫做数组的元素。
访问数组的元素:
数组[下标]; 下标是从0开始的。
【注】数组和循环是天生一对。
栈结构:
栈:木盆
结构:从同一头进,从同一头出。
特点:先进后出。
数组的两个方法形成栈结构:
push
格式:数组.push(参数1, 参数2...);
功能:给数组的末尾添加元素。
返回值:插完元素以后数组的长度。
pop
格式:数组.pop()
参数:没有参数
返回值:取下一个元素
功能:从数组末尾取下一个元素
队列结构
结构:从末尾进,从头部出。
特点:先进先出
push
shift()
格式:数组.shift()
参数:没有参数
功能:从数组的头部取下一个元素
返回值:取下的元素
unshift()
格式:数组.unshift(参数1, 参数2...)
功能:从数组的头部插入元素
返回值:插完元素以后数组的长度。
join()方法
格式:数组.join(字符串)
功能:将数组中的元素,用传入的拼接符,拼接成一个字符串
返回值:拼接好的字符串。
数组排序
sort
格式:数组.sort() 默认从小到大排序,按照字符串排序。
参数:一个函数,代表要怎么去进行排序(固定用法)
concat() 方法可以基于当前数组创建一个新数组。
slice() 方法可以基于当前数组获取指定区域元素 [start, end)
splice() 方法由于其参数的特殊性,可以完成 增、删、改三个功能