JavaScript中.apply.call()与.apply()的差异:为何代码结果不同?
为什么这两段JavaScript代码执行结果不同?
先搞懂两个关键逻辑:
Function.prototype.apply的本质是调用它自身this指向的函数,第一个参数是目标函数执行时的this,第二个参数是传给目标函数的参数数组。- 函数内部的
this完全由调用方式决定:obj.method()这种形式调用时,method的this就是obj;用call/apply调用函数时,this是call/apply的第一个参数。
第一段代码分析
console.log(Function.prototype.apply.call(Math.floor, undefined, [1.75]));
这里用call来调用apply函数:
call的第一个参数是Math.floor,所以apply执行时的this就是Math.floor——也就是说,apply现在要调用的目标函数是Math.floor。call的第二个参数undefined是apply的第一个参数(作为Math.floor执行时的this,但Math.floor是内置函数,这个参数不影响结果)。call的第三个参数[1.75]是apply的第二个参数(传给Math.floor的参数数组)。
这段代码等价于Math.floor.apply(undefined, [1.75]),也就是直接调用Math.floor(1.75),结果是1,所以console.log输出1。
第二段代码分析
console.log(Function.prototype.apply(Math.floor, undefined, [1.75]));
这里是直接以Function.prototype.apply(...)的形式调用apply:
- 这种调用方式下,
apply的this是Function.prototype(因为是Function.prototype的方法调用)——也就是说,apply现在要调用的目标函数是Function.prototype本身。 apply的第一个参数Math.floor是Function.prototype执行时的this(这个参数不影响Function.prototype的执行结果)。apply只接受两个参数,第三个参数[1.75]会被忽略;第二个参数是undefined,意味着传给Function.prototype的参数为空。
这段代码等价于Function.prototype.call(Math.floor),也就是调用Function.prototype()。而Function.prototype是一个内置的空函数,调用它会返回undefined,所以console.log输出undefined。
内容的提问来源于stack exchange,提问作者Amirreza
相关产品推荐
相关产品推荐

