3.3函数参数
- 什么时候使用参数
- 当函数中出现不确定的值的时候,传递不同的参数 实现不同的功能
- 参数
- 形参:function 函数名(形参1,形参2,.......){ 代码块 } 形参之间用逗号隔开
- 实参:函数名(实参1,实参2......)实参之间用逗号隔开 实参就是赋值给形参的值
- 参数个数问题
```js
// 1.形参和实参个数一样
function fun1(a, b) {//a 和 b都是形参 var a; var b; a=10 b=20
console.log(a, b);// 10 20
}
fun1(10, 20);
// 2.形参比实参个数多 从左往右一一赋值
function fun2(a, b, c) {//var a=10 var b=20 var c
console.log(a, b, c);// 10 20 undefined
}
fun2(10, 20);
// 3.形参比实参个数少 从左往右一一赋值 多余的并不用管
function fun3(a, b, c) {
console.log(a, b, c);// 10 20 30
}
fun3(10, 20, 30, 40);
// 4.参数个数不确定 arguments 参数的集合 arguments可以和形参一起使用
function fun4(a, b) {
console.log(a);// 10
console.log(arguments);//集合
console.log(arguments[0]);
console.log(arguments.length);// 2 3 4
var s = 0;
for (var i = 0; i < arguments.length; i++) {
s += arguments[i];
}
console.log(s);
}
fun4(10, 20);
fun4(10, 20, 30);
fun4(10, 20, 30, 40);
```
- 参数的数据类型
==所有的js数据类型都可以作为函数的参数 null和undefined不要作为参数 没有意义==
```js
// 5.参数的类型
// 所有的js数据类型都可以作为函数的参数 null和undefined不要作为参数 没有意义
function auto(a) {
console.log(a);
}
auto("文字");
auto([1, 3, 4, 5]);
auto(true);
auto({ "name": "zs", "age": 123 });
auto(function () { });
```
- ==函数的注意事项==
- 重名会被覆盖 后面的会覆盖前面的
- 当形参和实参参数不一致的时候 未被赋值的形参是undefined
```js
<script>
// 1.重名会被覆盖 后面的会覆盖前面的
function auto() {
console.log(1);
}
function auto() {
console.log(2);
}
auto();
// 2.当形参和实参参数不一致的时候
function fun1(a, b, c) {//形参var a var b var c a = 10 b=20
console.log(a, b, c);//10 20 undefined
}
fun1(10, 20);
</script>
```
### 3.4作用域
- 概念:变量或者函数的有效使用范围
- 分类:局部作用域 全局作用域
- 名词
- 全局变量/全局函数:在函数外面声明的变量/函数,可以在任意地方访问和修改,会一直存储在计算机的内存中,直到页面关闭
- 局部变量/局部函数:在函数里面声明的变量/函数,只有在函数内部可以使用,出了函数就会被销毁,不能使用
#### 3.4.1全局变量/函数
- 全局变量/全局函数:在函数外面声明的变量/函数,可以在任意地方访问和修改,会一直存储在计算机的内存中,直到页面关闭
```js
var a = 10;//a 全局变量
function fun1() {// fun1 全局函数
var b = 20;// b 局部变量
console.log(a);//10
console.log(b);// 20
function fun2() {
console.log("这是局部函数fun2");
};
fun2();
}
fun1();
console.log(a);//10
// console.log(b);//报错 b is not defined
```
#### 3.4.2局部变量/函数
- 局部变量/局部函数:在函数里面声明的变量/函数,只有在函数内部可以使用,出了函数就会被销毁,不能使用
```js
var a = 10;//a 全局变量
function fun1() {// fun1 全局函数
var b = 20;// b 局部变量
console.log(a);//10
console.log(b);// 20
function fun2() {
console.log("这是局部函数fun2");
};
fun2();
}
fun1();
console.log(a);//10
// console.log(b);//报错 b is not defined
```
==注意事项:==
- 注意1:只有函数{}内声明的都是局部 其他都是全局
- 注意2:声明变量没有var 这是一个全局变量
```js
// 注意1:只有函数{}内声明的都是局部 其他都是全局
if (1) {
var n = 30;//全局
}
console.log(n);//30
//注意2:声明变量没有var 这是一个全局变量
function fun3() {
a = 100;
}
fun3();
console.log(a);
```
#### 3.4.2作用域链
- 作用域链:js的一种查找机制,先找自身作用域范围内的,依次父级作用域查找,一直到全局(window),如果全局也不到,则是返回报错信息 xxx is not defined
```js
var a = 100;// a 全局变量
function fun1() {//fun1 局部变量
var a = 20;// a 局部变量
console.log(a);//20
}
fun1();
var b = 100;
function fun2() {
b = 10;
function fun2() {
var b = 20;
}
console.log(b);//全局变量的b 10
console.log(c);// c is not defined
}
fun2();
```