JS新手疑问:l函数无需显式参数而f函数需要,是否与call、apply有关?
解答你的JavaScript参数与
call/apply疑问 嘿,我来帮你理清这个问题!你疑惑的点其实涉及两个关键知识点:JavaScript函数的参数处理方式,以及call/apply的核心作用,咱们一步步拆解:
先看两个函数的参数差异
关于f函数的显式参数
函数f定义了arg这个显式参数,本质是为了直接通过参数名快速获取第一个传入的实参,比如你调用f('abc')时,'abc'就直接赋值给arg,写代码时可读性更高。其实就算f不定义显式参数,你也能通过arguments[0]拿到这个值,但显式参数让代码更清晰,尤其是当你只需要固定数量的参数时。
关于l函数的无参数写法
函数l没定义显式参数,是因为它用了JavaScript里每个普通函数(箭头函数除外)都自带的**arguments对象**——这个对象会自动收集调用函数时传入的所有实参,不管你传多少个。所以l(1,2,3)或者l.apply('abc', [1,2,3,4])时,所有参数都能通过arguments遍历拿到,根本不需要提前定义参数名,这种写法适合处理不确定数量的参数。
再讲call/apply的作用
这两个方法的核心是改变函数执行时的this指向,同时帮你传递参数:
f.call('123', 'abc'):第一个参数'123'是要绑定给f执行时的this的值,后面的'abc'是传递给f的实参,对应f里的arg参数——这里f有显式参数,所以这个实参会直接赋值给arg。l.apply('abc', [1,2,3,4]):第一个参数同样是绑定this,第二个参数是数组,apply会把数组里的元素展开成l的实参,这些实参全部被arguments对象收集,所以l不用显式参数也能读取到。
总结一下
- 函数要不要定义显式参数,完全取决于你想怎么获取传入的值:如果需要固定数量的参数、追求可读性,就定义显式参数;如果要处理任意数量的参数,用
arguments(或者ES6的剩余参数...args)更灵活。 call/apply和函数是否定义显式参数没有强制绑定关系——不管函数有没有显式参数,这两个方法都能传递参数,只是显式参数让获取特定位置的参数更直接。
附上你提供的代码:
function f(arg) { console.log(arg); console.log(this); } f('abc'); f.call('123', 'abc'); function l() { console.log(this); for (var i = 0; i < arguments.length; i++) { console.log(arguments[i]) } } l(1, 2, 3); l.apply('abc', [1, 2, 3, 4]);
内容的提问来源于stack exchange,提问作者Alexey_js




