保存对代码的热爱,并保存怀疑态度
入口 - 参数
- 实参
- 形参
- 类型
- 数量关系
- 数量一致时:从左向右一一对应
- 实参多:无法通过形参拿到多出来的实参,但是可以通过arguments拿到所有实参
- 形参多:多出来的形参为undefined
function fn(a){ // 形参
console.log(a);
}
fn(1) //实参
一. arguments
- 函数内部有一个隐藏对象,用来接收所有实参
- 类数组(伪数组)
- 具有的索引和长度的概念,但是不能使用数组的某些操作
- 利用数组的索引和长度配合循环,获取arguments中保存的实参
- 计算机中的索引从0开始
- 应用场景:当函数的实参个数不确定时,可以使用arguments找到所有实参
function fn(a){ // 形参
console.log(arguments); //全部参数 ,得到时一个数组 ,要想取得每个值可以用循环遍历出来
//if.html:57 Arguments(10) [1, 2, 3, 4, 5, 5, 6, 3, 4, 2]
for(var i=0;i<arguments.length;i++){ //遍历的是arguments的长度
console.log(arguments[i]) //取出每个值
}
}
fn(1,2,3,4,5,5,6,3,4,2) //实参
二. 出口 - 返回值
- 关键字:return
- 语法:return 要返回的数据或变量
- return,不仅可以返回数据,还会终止当前函数
- 所以,一个函数,只能执行一次return
- 一个return后只能跟一个数据
- 返回值的应用场景:
- 用来处理数据的函数,需要有返回值,返回处理之后的数据
- 实现功能的函数,没有必要有返回值,但是可以写
- 没有return的函数,会返回undefined
- 可以返回所有类型的值
function fn(a){ // 形参
console.log(arguments); //全部参数 ,得到时一个数组 ,要想取得每个值可以用循环遍历出来
//if.html:57 Arguments(10) [1, 2, 3, 4, 5, 5, 6, 3, 4, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]
var j=[] //用来保存arguments的值
for(var i=0;i<arguments.length;i++){ //遍历的是arguments的长度
j+=arguments[i] //取出每个值
}
return j;
}
console.log(fn(1,2,3,4,5,5,6,3,4,2) ) //实参 返回到执行函数身上了,也就是这个
三、作用域
- 变量生效的区域
- 全局作用域,内的变量,叫全局变量
- 不属于任何一个函数的区域
- 局部作用域,内的变量,叫局部变量
- 某个函数内部的区域
- 局部作用域可以使用全局作用域的变量或数据(子可以拿父)
- 全局作用域不能使用局部作用域的变量或数据(父不能拿子)
- 全局变量的生命周期
- 随着程序的启动被创建,程序完全结束后,才会被删除
- 相对局部来说,比较占空间
- 局部变量的生命周期
- 随着作用域的开启被创建,作用域的结束被删除
- 尽量少用全局
- 可以利用匿名函数生成独立作用域,在匿名函数内再写其他功能
(function(){
var i=0; //匿名函数会立即执行
})()
五、js的编译和执行
- 提升
- var声明的变量会自动提前到作用域开始的位置,执行
- 原位赋值
- function声明的函数,会整体提升到作用域开始的位置
- 当前作用域只要定义了函数,无论位置,都能执行
- 当var遇到function
- 赋值式创建函数
- var的变量和function的函数名重名
- var声明的变量会自动提前到作用域开始的位置,执行