Javascript 为什么应用调用函数不能传递正确的参数?
Javascript 为什么应用调用函数不能传递正确的参数?,javascript,Javascript,Function.prototype既有call又有apply,可用于应用函数。今天,我打算用apply来做点什么,但我还是设法弄错了一点: function foo(a) { console.log('foo', a) } foo.call.apply(null, [1]) 我花了一段时间才意识到我已经设法(大概是在受到某种影响时)在之前编写。调用。应用。然而,让我惊讶的是,这将抛出一个类型错误: > function foo(a) { console.log(a) } undefi
Function.prototype
既有call
又有apply
,可用于应用函数。今天,我打算用apply
来做点什么,但我还是设法弄错了一点:
function foo(a) { console.log('foo', a) }
foo.call.apply(null, [1])
我花了一段时间才意识到我已经设法(大概是在受到某种影响时)在之前编写。调用。应用。然而,让我惊讶的是,这将抛出一个类型错误
:
> function foo(a) { console.log(a) }
undefined
> foo.call.apply(null, [1])
TypeError: object is not a function
at repl:1:10
这让我愣住了一会儿,直到我意识到这一定是因为调用
函数绑定到null
。所以我想,让我们试着将它绑定到foo
,看看会发生什么:
> foo.call.apply(foo, [1])
foo undefined
嗯,和我想象的不太一样。函数已明确应用,但参数a
出于某种原因未定义
。我似乎无法理解这一点。删除.call
显然可以正常工作:
> foo.apply(foo, [1])
foo 1
因为我现在真的很好奇,所以我尝试了相反的方法:call
apply
函数:
> foo.apply.call(foo, 1)
foo undefined
function log() {
console.log('args: ', arguments, '\nthis: ', this);
}
这就是我所能做到的。我并不打算用它来做任何事情——首先这是一个诚实的错误——但我很想知道到底发生了什么,我希望你们中的一位大师能给出答案
为什么call
和apply
的行为是这样的?让我们从一个信息更丰富的“foo”函数开始:
> foo.apply.call(foo, 1)
foo undefined
function log() {
console.log('args: ', arguments, '\nthis: ', this);
}
所有函数都有相同的调用
和绑定
方法log.call
是一个函数,作为一个函数,它与其他函数具有相同的apply
方法。所以这两个是等价的:
log.apply.call === log.call
log.call === Function.prototype.call
称之为:
log.call.apply(null, [1])
Function.prototype.call.apply(null, [1])
与调用此相同:
log.call.apply(null, [1])
Function.prototype.call.apply(null, [1])
上面调用窗口上的函数.prototype.call
方法,将1
作为唯一参数传递
这显然是非常错误的call
只能用于函数,而不能用于窗口对象,传递给call的第一个参数应该是执行范围,而不是1
foo.call.apply(null, [1])
这将调用Function.prototype.call
,并将其上下文设置为null
,并将1
作为参数传递
就像你做的那样:Function.prototype.call(1)上下文(此
)设置为空的代码>。它试图运行null
的call
函数,所以这就是为什么会得到“object不是函数”
这不起作用,因为call
的参数是如何设置的。您正在调用Function.prototype.call(1)将上下文(this
)设置为foo
。就像你做的那样:foo.call(1)
如果要链接调用
和应用
,则必须执行以下操作:
foo.call.apply(foo, [null, 1]);
设置.call
函数的上下文,然后设置它的两个参数。这是一个完美的答案,可以清楚、简洁地解释所有问题。谢谢你抽出时间!我希望我能投两次票,真的很有用,我觉得我学到了一些东西。我喜欢那种感觉!