前面讲 函式 function 时提到参数,回头看自己打的文章发现错误的地方修正了一下。
Parameter:函式宣告里的参数。
Argument:引数,呼叫函式时传给 params 的资料。
练习:观察不同形式的函式参数的位置
// 练习改成函式运算式
const sum = function (a, b) {
return a + b;
};
// 练习改成箭头函式
const sum = (a, b) => a + b ;
在呼叫函式的时候最常见的就是函式名称加上小括号 ()
,而小括号内就是传给参数的值,也称引数 (arguments)。
而虽然在宣告函式时有指定参数的数量(像上例为两个参数),但是在呼叫的时候并不会检查有几个引数。也就是说把
sum(3, 4)
// 写成
sum(3, 4, 5, 6, 7)
// 或是
sum()
都是可以的,但是没有指定的部分都会变成 undefind,而多传入的参数在多数情况下没有意义。
实际上函式被呼叫的时候,会产生一个 arguments 物件,而这个物件是我们呼叫函数时所带入的参数。而拿刚刚举的例子
sum(3, 4, 5, 6, 7)
多传入的参数,我们可以函式里透过 arguments 这个物件来取得。因为有五个参数会先印出 5,然後回传 a+b 也就是 3+4 等於 7 的结果。
const sum = function (a, b) {
console.log(arguments.length); // 5
return a + b;
};
sum(3, 4, 5, 6, 7); // 7
arguments 虽然看起来像阵列(类阵列),但其实他是带有索引特性的物件,内建 length 属性。有取得参数的方式也能让函式更弹性的运用
Note: 「类阵列 (Array-like)」 的意思是 arguments 一样拥有 length 这项属性,以及从 0 开始的索引,但是它没有阵列内建的方法像是 forEach() ,或是 map() 。 -- MDN-Arguments 物件
例如取索引里其他的值来运算:
// sum 有五个值,分别为 arguments[0] 到 arguments[4]
const sum = function (a, b) {
return a + arguments[4]; // 索引从 0 开始
};
sum(3, 4, 5, 6, 7); // 10,3 + 7 = 10
或者用在回圈:
const sum = function () {
let num = 0;
for (var i = 0; i < arguments.length; i++) {
num += arguments[i];
}
return num;
};
sum(3, 4, 5); // 12
另外 arguments 物件还有一个属性,当我们想在函式内呼叫函式本身,可以透过 arguments.callee(),这在匿名函式里特别有用。MDN-arguments.callee
const sum = function (a, b) {
console.log(arguments.callee === sum);
return a + b;
};
sum(3, 4, 5, 6); // true
这里列举几个用法,有许多种可以参考 MDN-Arguments 物件。
而要注意的是「严格模式」不能用 arguments.callee 和 arguments.caller 以及在箭头函式无法使用 arguments 物件。
008天重新认识JavaScript
MDN-Arguments 物件
MDN-arguments.callee
>>: Day 19 Knative Serving DNS 测试
在SQL中其实不只可以将我们需要的资料从大量资料库中找出,还可以先整理,统整过後再输出 这也是非常实...
搭配 in 的 for 回圈会搜寻物件中所有 property 为 enumerable 者 而使...
在很多情况下,我们的程序,通过命令终端与用户交互。让用户输入,yes 或 no 是一种很常见的场景。...
在接下来的铁人文中会陆续访问来自不同接触过 APCS 的人。除了准备过 APCS 的同学外,期望也可...
上期介绍了Mojo Lens(AR隐形眼镜)的一些功能,了解到了他的特别之处,但除了这些特点之外,他...