解析jQuery插件样板代码第10、12行:关于arguments与call()的疑问
关于代码第10、12行及相关疑问的解答
嘿,我来帮你把这些疑问掰扯清楚,咱们一步一步拆解:
1. 先搞懂arguments是什么
arguments是函数内部自动存在的特殊类数组对象,完全不需要你手动定义!只要调用一个函数,这个函数的作用域里就会自动生成arguments,它包含了调用该函数时传入的所有参数——你可以通过索引(比如arguments[0])访问单个参数,也能通过arguments.length获取参数总数。
2. call()的核心作用
call()是函数的内置方法,主要干两件关键的事:- 强行改变目标函数执行时的
this指向,让目标函数内部的this绑定到你指定的对象上; - 可以在
call()的第一个参数之后,直接传递参数给目标函数。
- 强行改变目标函数执行时的
- 举个简单例子:
func.call(obj, a, b),意思就是让func函数以obj作为this来执行,同时把a和b作为参数传给func。
3. 第10行的纠正与补充
你之前的理解方向是对的,但可以更精准:
若传入
samplePlugin的参数为方法,则通过call()让该方法执行时的this指向当前脚本上下文的this(也就是第10行所在环境的this,比如可能是插件实例、全局对象或者某个特定对象,具体要看代码的整体上下文),同时还会把后续的参数传递给这个方法。
4. 再深入说说Array.prototype.slice.call(arguments, 1)
你已经知道它能把除首个参数外的所有参数转为真实数组,再补充两个关键点:
- 为什么不能直接用
arguments.slice(1)?因为arguments是类数组,不是真正的数组,它没有数组的slice方法,所以得“借用”数组原型上的slice方法; Array.prototype.slice.call(arguments, 1)的本质是:用call()把slice方法的this绑定到arguments上,让slice以为自己是在处理一个数组,然后从索引1开始截取元素,最终返回一个标准的数组。
内容的提问来源于stack exchange,提问作者user1032531
相关产品推荐
相关产品推荐

