⛅Hello,大家好,这里是X,今天带来的是javascript函数问题,说到函数,我相信大家都不陌生了,它对于任何语言来说都是一个核心的概念,但是在javascript中呢,函数这一部分,又有点不一样,那么今天就带来这方面的讲解,感兴趣的,别忘了点赞+收藏噢😎
普通函数
原型
function fun(arg0,arg1,...,argN){
statements;
}
例子
html
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>demo-01</title>
<script type="text/javascript" src="./js/demo01.js">
</script>
</head>
<body>
</body>
</html>
js
function demo01(name, message){
alert("Hello"+name+","+message);
}
demo01("monster","here is demo01");//调用函数
效果
总结
关于return语句
在javascript也是一样,在定义函数的时候不必指定是否有返回值,关于返回值:
- 可以单个
- 可以多个
- 可以没有返回值
推荐的做法就是要么让函数始终都返回一个值,要么永远都不要有返回值
🤔🤔🤔
关于函数参数的各种问题
前景知识
在JavaScript中函数的参数和其他的语言的函数参数有所不同,那就是JavaScript中函数不介意传递进来多个参数,也不在乎传进来的参数是什么返回值
举个例子
一个函数,你写了3个参数,那你在调用这个函数的时候,不一定就要传递3个参数,传递1个、2、3个甚至不传参数都可以!
深入一下理解其中原理
为什么在JavaScript中可以对函数参数的限制那么的“宽松”呢?和我们平时接触到的函数非常的不一样!不管是C语言还是Java,对于函数参数的定义都是非常严格的,特别是C语言,因为C语言还会扯到指针😫,所以每个参数都是必须要一一对应才行,但是在JavaScript中之所以不需要的原因就是因为 在JavaScript中所有的参数在内部是用一个数组来表示的,写的每一个函数接收到的不是你传过来的参数,而是去接触这个数组!所以函数不关心数组中包含了哪些参数,如果说这个数组不包含任何元素,也无所谓,如果很多参数,也没问题! 那么我们该怎么去访问这个数组呢?
我们通过arguments对象去访问这个数组,至于这个参数的问题,我下面举几个有意思的例子
例子💭💭💭💭💭
下面的函数sayhi()函数根本就没有参数的选项,但是我的输出,是有参数的!
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript参数问题</title>
<script type="text/javascript">
function sayhi(){
alert("hi"+","+arguments[0]+","+arguments[1]);
}
sayhi("xmonster","good");
</script>
</head>
<body>
</body>
</html>
效果
再来一个例子深入一下
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript参数问题</title>
<script type="text/javascript">
function howManyArgs(){
alert(arguments.length);
}
howManyArgs("xmonster",1);
</script>
</head>
<body>
</body>
</html>
效果
在这里的原理大家都懂,和上一个例子差不多,那么现在我们去解析在JavaScript内部的arguments数组里,到底是什么样的
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript参数问题</title>
<script type="text/javascript">
function howManyArgs(){
alert(arguments.length);
}
function doSum(){
if(arguments.length==1){
alert("arguments now have"+arguments[0]);
}
}
howManyArgs("xmonster");
doSum(10);
</script>
</head>
<body>
</body>
</html>
结果
独自意会一番噢
那么现在有一个问题就是,在上面的例子里我是没有加参数的,那如果我在函数体内定义了argument的某一个值,但是传参的时候我传的又是其他的值,那么系统会遵循哪一个呢?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript参数问题</title>
<script type="text/javascript">
function whichArgu(num1, num2){
arguments[0] = 1;//在这里写死arguments[0],也就是第一个参数的值
alert(num1+num2);
}
whichArgu(2, 3);
</script>
</head>
<body>
</body>
</html>
结果
可以看到我们得到的结果不是5,而是4,说明argument还是非常的强大的!
但是要注意一个非常重要的点,那就是argument的值和num1的值,这两个值的 内存空间是独立的 ,只是它们的值会同步,仅此而已!这也得到了:修改命名参数不会改变arguments中对应的值,还有一点要注意❗❗❗,如果说只是传了一个参数过去,那么arguments[1]的值不会反映到命名参数中的,因为arguments的对象的长度由传入的参数个数决定,不是由命名参数个数决定!
最后,再说一个知识点:
💢在JavaScript中,所有的参数传递的都是值,不可能通过引用传递参数