函数运行的时候,有时须要提供外部数据,不一样的外部数据会获得不一样的结果,这种外部数据就叫参数。
上式的 x 就是square函数的 参数。每次运行的时候,须要提供这个值,不然得不到结果。javascript
形式参数和实际参数是不一样的变量,他们在内存中处于不一样的位置,形式参数在函数运行结束时将被释放。html
若是函数在调用时未提供实际参数,参数会默认设置为: undefinedjava
若是y已经定义 , y || 返回 y, 由于 y 是 true, 不然返回 0, 由于 undefined 为 false。web
(1)当调用函数时传递的实参比函数定义时的形参个数少,剩下的形参都将设置为 undefined 值。segmentfault
(2)一般函数只保留靠前的参数,而省略靠后的参数。若是必定要省略靠前的参数,只有显式传入 undefined。数组
(1)若是函数调用时设置了过多的实际参数,剩下的实际参数没有方法直接获取,须要使用即将提到的arguments对象。函数
(1)因为 JavaScript 容许函数有不定数目的参数,因此须要一种机制,能够在函数体内部读取全部参数。这就是arguments对象的由来。spa
(2)arguments对象包含了函数运行时的全部参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可使用。3d
(1)指针
(2)
(1)经过arguments对象的length属性,能够判断函数调用时传递的实际参数个数。
(2)注意
arguments对象的length属性显示实参的个数,函数的length属性显示形参的个数
(3)形参只是提供便利,但不是必需的
(1)须要注意的是,虽然arguments很像数组,但它是一个对象。数组专有的方法(好比slice和forEach),不能在arguments对象上直接使用。
(2)若是要让arguments对象使用数组方法,真正的解决方法是将arguments转为真正的数组。
(3)下面是两种经常使用的转换方法:slice方法和逐一填入新数组。
(1)arguments对象有一个名为callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。
(2)下面是经典的阶乘函数
(3) 可是,上面这个函数的执行与函数名牢牢耦合在了一块儿,可使用arguments.callee能够消除函数解耦
(4) 但在严格模式下,访问这个属性会抛出TypeError错误
(5)这时,可使用具名的函数表达式
参考文章