一、函数
函数的概念
函数,也叫功能或方法,函数将一段具备某项特殊功能的代码段封装成一个完整的结构体。
函数的作用就是封装一段功能代码,可以被反复调用,实现代码的重用
函数的声明
声明语法:
function 函数名 (参数){
函数的结构体;
}
函数在声明时,函数体不会执行,只有在被调用的时候才会执行
函数的调用
函数调用方式: 函数名(参数),形如:foo();
函数参数: 专门接收函数执行时所必须的数据的变量
函数的参数可以设置0个或者多个,参数之间用逗号隔开
函数的参数有两种名称:形参和实参,其本质都是各种类型的数据变量
形参:形式参数, 在函数定义中,()内部的参数叫做形参,用来接收函数调用时实参传递过来的数据
实参:实际参数,在函数调用中,()中的参数就是实参,用来传递数据给形参使用
arguments对象
arguments对象是函数的一个内置属性,arguments对象中存储着实参的所有值,是一个类数组对象,能够通过遍历进行取值
函数的返回值
函数在执行完毕后,会返回一个执行结果,通过return关键字实现函数的返回值
如果不写return 语句,则函数默认返回undefined
如果存在return 语句,则函数返回值为return 后面的数据
其中,如果函数内部执行了一个return语句,则函数体之后的代码将不会再执行
作用域与作用域链
变量的可用范围,scope
本质其实是一个存储多个变量的对象
js中存在两种作用域:全局作用域和函数作用域
全局作用域:专门保存全局变量的对象
函数作用域:专门保存函数内部的局部变量的对象
局部变量:只有在函数调用时的函数内部才能使用
全局变量:在任何时候的任何位置都可被访问
作用域链:在对变量取值时,都是从当前定义变量的函数开始查找,如果当前没有定义该变量,则从上层查找,直到查找到全局作用域,这种查找过程中形成的链式结构,就是作用域链
函数声明提前问题
在正式执行程序前,都会先对var 声明的变量 和 function 声明的函数进行预解析,将变量和函数集中到当前作用域的顶部进行集中声明,其中,先提升var 声明的变量,再提升function 声明的函数
赋值操作则留在原地
预解析完成后,再根据新的代码顺序,从上往下按照既定的规律执行js
函数表达式
函数表达式也是函数声明的另一种方式,写法:
var 函数名 = function(参数){
函数体;
return 返回值
}
使用函数表达式的方式进行函数声明时,在预解析过程中,就不会进行函数声明提升了,而是进行变量声明提升
立即执行函数 IIFE
IIFE:Immediately-Invoked-Function-Expression,即时调用的函数表达式,表示在函数定义时就立即调用
要实现IIFE,必须将函数转换为表达式形式,才能实现自调用
方法: 通过一定的手段,让函数参与特定的运算,即在函数前加一些运算符,如:
数学运算符: +、 -、 ()
逻辑运算符: !
IIFE最常用的就是通过加 () 运算符来实现,如:
(function(i){
console.log(i); // 1
})(1);
二、数组
多个数据或变量按一定顺序保存在一个集合中,则称这个集合为数组
创建数组
创建数组的4种方式
创建空数组
var 数组名 = []; --->在js中,数组的字面量就是 []创建数组的同时,初始化数组中的每个元素
var 数组名 = [值1, 值2, 值3, ...];创建空数组
var 数组名 = new Array(n);
这种方法,创建一个数组类型的对象,n 表示初始化元素的个数,省略则表示空数组,不省略则表示创建一个具有n个undefined值的数组创建数组同时初始化数组元素
var 数组名 = new Array(值1, 值2, 值3, ...)
其中 new Array 在一定情况下存在歧义,比如:new Array(3); 代表3个元素值为undefined的数组,而不是元素值为3的数组。
获取数组元素
通过数组的下标 i 来获取数组的每一个元素,即 数组名[i] = 值
其中,i 从0开始计算,按照整数开始排序,如 0,1,2,3,...
数组的长度
length,能记录数组的数据总长度,如 数组名.length
数组的长度与数组最后一项的下标存在一定关系,即最后一项的下标等于数组的length-1
数组的长度也不是固定的,可以发生更改,当数组的个数增加时,length值自动跟着改变
数组length属性有两个固定用法:
- 获取最后一个元素值:arr[arr.length - 1]
- 向数组末尾追加一个新元素: arr[arr.length] = 新值;
数组的遍历
主要是根据数组的下标在0 到 length - 1 之间,用for循环来对数组的每一个元素进行访问。
关联数组
上面所讲的是常规的索引数组,还有一种数组叫关联数组,可自定义下标,
创建关联数组的方法:
1、第一步,先创建空数组,var arr = [];
2、第二步,再向数组中添加元素,arr[key] = value; 如:arr[''name''] = "张三",arr["age"] =30;
其中,key为字符串, length属性无效,永远为0,同时,关联数组中的key 不能重复,如果访问不存在的下标元素,也不会保存,返回undefined值
遍历关联数组:for (var key in arr) { } 结构
三、对象
对象的基本概念
JS中的对象是无序属性的集合,属性可以是基本值、函数等。对象的结构可以看成是一种键值对的形式,值可以是数据和函数。
对象的创建
创建对象的最简单的方式:使用对象字面量赋值给变量,类似数组
对象的字面量语法: {},内部可以存放多条数据,数据之间用逗号隔开,每条数据是以键值对的形式存在,即 k(属性名): v(属性值,值可以是任意类型的数据,简单数据类型、函数、对象),如:
var obj = {
k1: v1,
k2: v2,
k3: v3
};
在对象中,特征,用属性表示, 行为,则用方法表示
对象方法和属性的调用
在调用对象的属性时,有两种形式:
obj.属性名 或者 obj["属性名"],如果属性是个变量,则只能使用 [] 的形式表示,即 obj[属性]
在调用对象的方法时,需要在方法名后加()执行,即 obj.fn()
对象的遍历
可以将对象看成是一种键值对形式的数据结构,在遍历对象时,类似数组,通过 for in 循环,根据属性名遍历出每一项对应的属性值,即:
for(var key in obj){
var value = obj[key];
...
}