Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/448.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么应用调用函数不能传递正确的参数?_Javascript - Fatal编程技术网

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
函数的上下文,然后设置它的两个参数。

这是一个完美的答案,可以清楚、简洁地解释所有问题。谢谢你抽出时间!我希望我能投两次票,真的很有用,我觉得我学到了一些东西。我喜欢那种感觉!