一、函数
Number() / parseInt() / parseFloat() / alert() / prompt()...
函数分为系统函数和自定义函数
函数:是一个功能体,提供若干个数据,返回处理结果,用于封装重复执行的代码
- 创建普通函数
function 函数名称(){ 函数体---封装的要重复执行的代码 } |
函数只是创建不会执行函数体中的代码
调用
函数名() //执行函数体中封装的代码
- 创建带有参数的函数
function 函数名称(参数列表){ //用于接收外部传递的数据 函数体 } |
调用
函数名称(参数列表) //实际传递的数据
创建函数是的参数称为形参,调用函数时的参数称为实参,实参会赋值给形参,实参和形参的数量可以不匹配,如果形参未被赋值则为undefined
- 创建带有返回值的函数
function 函数名称(参数列表){ //用于接收外部传递的数据 函数体 return 值; // 返回值,函数调用后得到的结果 } |
调用
函数名称(参数列表)
return 用于返回函数调用结果,如果函数中没有写return或者return后不加任何值返回undefined,一旦return执行就会结束函数的执行
对比return和break return用于函数中,结束函数的执行 break用于循环和switch-case,结束循环或者switch-case的执行 |
二、作用域
-
变量的作用域
- 全局变量:在全局作用域下声明的变量就是全局变量,可以在任意的作用域下访问
- 局部变量:在函数作用域下声明的变量就是局部变量,只能在当前的函数作用域下访问到
- 全局作用域:函数以外的作用域
- 函数作用域:函数以内的作用域
- 函数内不加var声明的变量是全局变量
- 变量提升:在执行程序前,会将var声明提升到所在作用域的最前面,值提升声明,赋值不提升
-
函数的作用域
- 全局函数:在全局作用域下创建的函数,可以在任意作用域下访问到
- 局部函数:在函数作用域下创建的函数,只能在当前函数作用域下访问到
- 作用域链:多个作用域嵌套的作用域结构,在寻找变量的时候,先到当下的作用域下寻找,如果当前没有会不断往上一级作用域寻找
- 函数提升:程序执行前,会将函数提升到所在作用域的最前面,是整体提升
三、递归
- 在函数的内部调用自身,本身是一个死循环,造成内存泄漏
- 内存泄漏:内存中的空间被占满,无法保存新的数据.
- 如何使用递归:
- 要求边界条件
- 结合着return
四、匿名函数
function () {}
函数声明 function fn(){ } |
函数表达式 var fun=function(){ } 变量名称就是函数名称 |
对比函数名称()和函数名称
函数名称() :调用函数,执行函数体中的代码,得到返回结果
函数名称 :是一个变量,变量中保存了一个函数
对比函数声明和函数表达式的区别
函数名称创建的函数存在函数整体提升,可以先写调用再写创建
函数表达式创建的函数只是存在变量声明的提升,必须先写创建再写调用
匿名函数自调用
为了防止全局污染
(fuction(){ 函数体 //函数作用域,变量是局部变量 })(); |
回调函数
将函数作为参数传递
function tao(madai){ madai //调用传递进来的函数 } function dong(){} tao(dong) //函数dong作为参数传递,叫做回调函数 tao(function(){ }) //匿名函数作为参数传递也是回调函数 |
系统函数
isNaN() 检测一个值是否为NaN,会隐式转换为数值,是NaN返回true 不是->false
五、对象
对象是引用类型数据
对象是一组属性和方法的集合
一部手机 属性:有品牌\颜色\内存大小\屏幕尺寸..
方法:有打电话\玩游戏\看视频\听音乐...
一本书 属性:书名\页数\颜色...
万物皆对象
JS的对象
自定义对象:自己创建对象
内置对象 :JS提供的对象
宿主对象 :根据不同的执行环境划分
(2)使用对象字面量创建对象
{属性名:属性值,属性名:属性值}
属性名的引号可加可不加,如果含有特殊字符必须添加
属性的访问
对象.属性名
对象[‘属性名’]
如果属性名不存在返回的结果是undefined
使用内置构造函数创建对象
new Object() 返回一个空对象 ,需要单独添加每一个属性
构造函数:使用new来调用,返回对象
遍历属性
通过循环的方式,依次访问对象中的每个属性
for(var k in 对象){ k 代表每一个对象 对象[k] 代表属性名对应的属性值 } |
- 方法
对应的是一个函数,需要调用
var person={ play:function(){ this } } this //指向调用方法的对象 person.play(); //调用方法 |
(4)检测属性是否存在
对象.属性名===undefined true->不存在 false->存在
对象.hasOwnProperty(‘属性名’) true->存在 false->不存在
‘属性名’ in 对象 true->存在 false->不存在
六、数据的存储
- 原始类型:将数据执行保存到了栈内存
- 引用类型:包括对象\函数\数组等..都是引用类型数据,将数据保存在了堆内存中,同时会生成一个地址,然后将地址保存到了栈内存的变量中
- 引用类型数据的销毁:数据不被任何的地址所指向就会自动销毁;
- null:是一个空地址,不指向任何的引用类型数据,只需赋值为null即可销毁引用类型数据
七、数组
数组是一组数据的集合,每个数据称为元素
- 数组字面量
[元素1,元素2]
- 访问数组元素
数组[下标]
下标:自动为元素添加的编号,是0开始的整数
- 数组的长度
数组.length 获取数组元素的个数
在数组的末尾添加新的元素 数组[数组.length]=值;
- 内置构造函数创建数组
new Array(元素1,元素2);
new Array(3) 创建一个数字,初始化长度,可以添加更多个元素
(5)数组的分类
数组分为索引数组和关联数组
索引数组:以>=0的整数作为下标
关联数组:以字符串作为下标,需要手动添加元素,是为了强调某一个元素
- 遍历数组
依次访问对象中的元素
for-in for( var k in 数组){ k代表下标 数组[k] 下标对应的元素 } |
循环(推荐方法) for(var i=o;i<数组.leng;i++){ i代表下标 数组[i] 下标对应的元素 } |