JavaScript学习——函数的实参和形参

来源:互联网 发布:淘宝众筹首页 编辑:程序博客网 时间:2024/06/04 19:25

JavaScript函数的实参和形参


《JavaScript权威指南中有这样一句话:
        JavaScript函数是参数化的:函数的定义会包括一个称为形参(parameter)的标识符列表,这些参数在函数体中像局部变量一样工作。函数调用会为形参提供实参的值。函数使用它们实参的值来计算返回值,成为该函数调用表达式的值。

        以上话的意思就是:形参相当于函数中定义的变量,实参是在运行时的函数调用时传入的参数。

        举个例子:

function myFunction(param1, param2){    //你的代码}myFunction(1, 2);


        在这个例子中,param1和param2就是形参,1和2就是实参。


        JavaScript中的函数定义并未指定函数形参的类型,函数调用也未对传入的实参值做任何类型检查。


        实际中,JavaScript函数调用甚至不检查传入形参的个数。

可选形参
        当调用函数的时候传入的实参比函数声明时指定的参数个数要少,剩下的形参都将设置为undefined值。因此在调用函数时形参是否可以省略应当保持较好的适应性。为了做到这一点,应当给省略的参数赋一个合理的默认值。

可变长的实参列表:实参对象
        在函数体内,标识符arguments是指向实参对象的引用,实参对象是一个类数组对象,这样可以通过数字下标就能访问传入函数的实参,而不用非要通过名字来得到实参。(arguments并不是真正的数组,它是一个实参对象。它是一个对象,只是具有数字索引的属性。)

        arguments包含一个length属性,用以表示包含元素的个数。可以通过arguments[index]来表示相应的实参。

        实参对象有一个重要的用处,就是让函数可以操作任意数量的实参。(不定实参函数)

        在非严格模式下,当一个函数包含若干形参,实参对象的数组元素是函数形参所对应实参的别名,实参对象中以数字索引,并且形参名称可以认为是相同变量的不同命名。

        在严格模式中,arguments是一个保留字。严格模式中的函数无法使用arguments作为形参名或局部变量名,也不能给arguments赋值。
        实参对象的callee和caller属性
                ECMAScript标准规范规定callee属性只带当前正在执行的函数。
        举个例子
var factorial = function (x){    if (x <= 1){    return x * arguments.callee(x - 1);    }};
caller是非标准的,但大多数浏览器都实现了这个是属性,它指代调用当前正在执行的函数的函数。通过caller属性可以访问调用栈。

将对象属性用做实参
        最好通过名/值对的形式来传入参数。

实参类型
        笔记开头说过,JavaScript方法的形参并未声明类型,在形参传入函数体之前也未做任何类型检查。JavaScript在必要的时候会进行类型转换。因此如果函数期望接收一个字符串参数,而调用函数时传入其他类型的值,所传入的值会在函数体内将其用做字符串的地方转换为字符串类型。

        所有的原始类型都可以转换为字符串,所有的对象都包含toString()方法。
        最好给所写的函数添加类似的实参类型检查逻辑。






以上笔记整理自《JavaScript权威指南》/《JavaScript高级程序设计(第3版)》,用做个人学习分享。




原创粉丝点击