基本语法:
function name(arg0,arg1,arg2){ statements} (注意没有;)
如
function sayHi(name,mes) { console.log("hello "+name+","+mes ); } // 调用函数,形参变为实参 sayHi("solin","you are a superhero");
函数在定义时候,不必指定是否含有返回值,实际上在ECMAScript中任何函数在任何时候都可以通过return语句来实现返回值;
function sum(num1,num2) { return num1+num2; } console.log(sum(2,3));
输出为:5;
注意!位于return之后的代码永远不会执行!
所以希望某些代码不执行的时候,可以直接在前加return;及之后的代码永远不会执行.
推荐让函数永远有返回值或者永远没有,方便进行调试.
---------
关于参数
!ES中不介意传递多少个参数,也不介意参数的数据类型,理由是ES中内部参数是用数组表示的,直接可以通过arguments[]来进行访问参数.
重写第一段代码,输出结果也是一样的
function sayHi() { console.log("hello "+arguments[0]+","+arguments[1]); } // 调用函数,形参变为实参 sayHi("solin","you are a superhero");
name,mes称之为标识符.
可以通过arguments.length来获取参数个数;
{console.log(arguments.length)};
();=>0 (12)=>1 ("string",1)=>2
当然参数对象和命名对象在es中也是不冲突的.
再看下面的代码
function doAdd(num1,num2) { arguments[1]=10; console.log(arguments[0]+num2); } doAdd(10,5);
输出结构为20,即会重写num2的值, 因为arguments[1]修改了,所以num2也进行了修改.
但是!他们并没有访问相同的内存空间.内存空间独立,值同步!
如果我们把赋值该等等于号呢?
显然是15,函数内部>命名参数
再看
function doAdd(num1,num2) { arguments[1]=10; console.log(arguments[0]+num2); } doAdd(10);
如果只传入一个参数10,则返回NaN,undefined,因为arguments的长度是有传入参数决定的,而不是定义函数命名参数决定的(num1,num2). 没有传值得参数自动命名为undefined.
我们必须知道 es中参数传递就是值,按值传递,不能通过引用传递参数.
最后,参数没有重载,同名函数后定义覆盖前定义.