之前没有注重基础,直接去后面看高级内容,结果是一点儿也看不懂,还耽误了很多时间,现在从基础、细节开始学JavaScript
先看函数的形参和实参
有下面这个函数
function sum(a,b){
return a+b
}
console.log(sum(1,5))
这个就是一个简单的函数,其中a,b是形参,console里面的1,5是实参
但是实际上参数的运用复杂很多
arguments
第一点,实参的形参的值的个数是可以不相等的
在每个函数内部都有一个隐式的东西,叫做 arguments,实参列表,是一个数组(实际上是长得像数组的对象),用来接收所有的实参、而不用去管形参有多少个、是否能与实参对应。
arguments.length
可以返回实参的个数,这样我们就可以用一个循环把实参内的值全部输出。
function sum(a) {
for (var i = 0 ; i < arguments.length; i++){
console.log(arguments[i])
}
}
sum(a,b,c,d)
在这个函数里面,sum.length
可以返回形参的个数,注意:这里sum不是一个数组,所以不可以用sum[i]来输出。
当然,这样可以对任意个数求和,而不用提前设置形参的个数
var result = 0
function sum(c,d,e){
for (var i = 0;i<arguments.length;i++){
result += arguments[i]
}
console.log(sum[0])
console.log(b)
}
sum(1,2,3,4,5,3,2,2,3)
实参和形参的映射关系
如下函数:
function sum(a,b) {
// arguments[1,2]
// var a = 1 实参传进来后相当于对形参里面的a和b进行了这样的赋值
var a = 2 // 重新赋值
console.log(arguments[0]) //2 表明形参变实参也会变
arguments[0] = 3 // 对第一个实参重新赋值
console.log(a) // 3 实参变形参的值也会变
}
sum(1,2)
在这里,实参和形参中任何一个变、另一个都会变,但这并不是因为他们是引用值(事实上,它们并不是引用值,而是原始值),而是因为它们之间是映射关系。
还有一种特殊情况
如果实参的数量比形参少,如下代码
function sum(a,b) {
var b = 2
console.log(arguments[1])
}
sum(1)
这里的输出结果是undefined,说明实参的个数在它出生时就已经定义好了,后面再对形参进行修改,也不会影响到实参
网友评论