如果把函数比喻成一台机器,那么参数就是原材料,返回值就是最终产品;从一定程度上讲,函数的作用就是根据不同的参数产生不同的返回值。
形参和实参是什么
function funName(形参){//定义函数时的参数叫做形参}
funName(实参)//调用时给到的参数称为实参
定义可能有点苍白无力,那么我们用例子来说明
function text(a) {
console.log('这里是传的<<' + a + '>>参数')
}
text()
text('hi')
text('Hello World')
先看看输出结果吧
这里函数中的a是函数text的形参,'hi’和’Hello World’都是函数的实参
需要注意的是,当没有传参时,这里输出的是undefined,原因是函数内的预编译
形参,实参数量不对等的情况
在上面中我们已经初步了解了实参和形参是什么,在一些情况下,我们会发现实参数目与形参数目不一定对等,但是他们也存在着一一对应的关系,这里我们介绍一下当形参,实参数量不对等的两种情况:
- 实参数目大于形参数目
- 形参数目大于实参数目
实参数目大于形参数目
当实参数目大于形参数目的时候会出现什么情况呢?
function exe(a) {
console.log(a) // 1
// 这里我们发现我们没有办法获取所有的实参,怎么才能获取我们的所有实参呢,此时我们可以利用arguments,如下
console.log(arguments[0]) // 1
console.log(arguments[1]) // 2
console.log(arguments[2]) // 3
console.log(arguments[3]) // 4
}
exe(1, 2, 3, 4)
我们会发现当实参数目大于形参数目时,只会获取相应形参数目的参数进入函数,要想获取实参,需要通过arguments来获取的
形参数目大于实参数目
当形参数目大于实参数目的时候会出现什么情况呢?
看个例子:
function exe(a, b, c, d) {
console.log(a, b, c, d)
// 1 undefined undefined undefined
}
exe(1)
这里输出 1 undefined undefined undefined的原因是因为有四个形参一个实参,只传入了一个实参,不过这里我们也能发现当形参数目大于实参数目,我们的实参是按从左到右的顺序传入,不够的赋值undefined;
参数的修改
刚才提到了参数不对等的情况,那么这里提一下修改的方法
可以修改的情况
当传入的形参数量与实参一样的时候以及当形参数目小于实参数目时,我们是可以正常修改的
看下面:
- 传入的形参数量与实参一样的时候
看例子
function exe(a, b) {
console.log(a, b)
console.log(arguments)
arguments[0] = 9;
arguments[1] = 10;
console.log(a, b)
console.log(arguments)
}
exe(1, 2)
此时输出结果为
成功的修改
2. 当形参数目小于实参数目
例子直接演示:
function exe(a, b) {
console.log(a, b)
console.log(arguments)
arguments[0] = 9;
arguments[1] = 10;
console.log(a, b)
console.log(arguments)
}
exe(1, 2, 3, 4)
此时输出结果:
我们可以看到这种情况下也是修改成功的,那么什么情况下我们修改不了呢?
不可以修改的情况
上面我们讨论的是可以修改的情况,现在我们看看什么情况下修改不了,
- 实参数目少于形参数目,少掉那部分就不能修改了
- 当开启了严格模式时,实参列表就与实参脱离关系时也不能修改
下面我们来分别演示一下:
- 实参数目少于形参数目,少掉那部分就不能修改了
function exe(a, b) {
console.log(a, b)
console.log(arguments)
arguments[0] = 9;
arguments[1] = 10;
console.log(a, b)
console.log(arguments)
}
exe(1)
康康结果
这个时候我们发现只有a改了,b并没有赋值
让我们看看第二种情况
2. 当开启了严格模式时,实参列表就与实参脱离关系时也不能修改
严格模式:
上面提到严格模式,那么严格模式是什么呢
严格模式的定义
ECMAScript 5的严格模式是采用具有限制性JavaScript变体的一种方式,使代码显示地 脱离“马虎模式/稀松模式/懒散模式“(sloppy)模式。它的产生是为了形成与正常代码不同的语义。
严格模式的作用
-
修复了局部函数this问题。
-
定义变量必须加var。
-
if、for语句里不允许有定义函数。
-
干掉了with。
严格模式的调用
1 为脚本开启严格模式 , 为整个脚本文件开启严格模式,需要在所有语句之前放一个特定语句 “use strict”; (或 ‘use strict’;)
2 为函数开启严格模式,要给某个函数开启严格模式,得把 “use strict”; (或 ‘use strict’; )声明一字不漏地放在函数体所有语句之前。
这里只是引用,不再做具体的阐述,想深入了解可以查询官方文档;
"use strict"
function exe(a, b) {
console.log(a, b)
console.log(arguments)
arguments[0] = 9;
arguments[1] = 10;
console.log(a, b)
console.log(arguments)
}
exe(1)
这里我们为这个函数开启了严格模式;看一下输出的结果:
我们可以发现这个时候仅仅改变了实参列表,并没有对实参造成任何影响