为什么应用调用函数没有传递正确的参数
Why does applying the call function not pass the correct argument?
Function.prototype
同时具有可用于应用函数的call
和apply
。今天,我打算用apply
来做一些事情,但我设法偷偷输入了一个拼写错误:
function foo(a) { console.log('foo', a) }
foo.call.apply(null, [1])
我花了一段时间才意识到,我已经设法(大概是在某种影响下(在.apply
之前写了.call
。然而,令我惊讶的是,这将抛出一个TypeError
:
> function foo(a) { console.log(a) }
undefined
> foo.call.apply(null, [1])
TypeError: object is not a function
at repl:1:10
这让我有一段时间目瞪口呆,直到我想这一定是因为call
函数绑定到了null
。所以我想,让我们试着把它绑定到foo
上,看看会发生什么:
> foo.call.apply(foo, [1])
foo undefined
啊,不完全是我所期望的。函数已明确应用,但由于某种原因,参数a
为undefined
。我似乎想不通。删除.call
显然如预期一样有效:
> foo.apply(foo, [1])
foo 1
因为我现在真的很好奇,我尝试了相反的方法:call
apply
函数:
> foo.apply.call(foo, 1)
foo undefined
这是我所能做到的。我无意将其用于任何事情——这首先是一个诚实的错误——但我很好奇到底发生了什么,并希望你们中的一位大师能给出答案。
为什么call
和apply
会这样?
foo.call.apply(null, [1])
这调用Function.prototype.call
并将其上下文设置为null
,并传递1
作为参数。
所以,就像您所做的:Function.prototype.call(1);
,上下文(this
(设置为null。它试图运行null
的call
函数,所以这就是为什么您得到"对象不是函数"。
foo.call.apply(foo, [1])
这不起作用,因为call
的参数是如何设置的。您正在调用Function.prototype.call(1);
,上下文(this
(设置为foo
。就像你做的一样:foo.call(1)
。
如果你想连锁call
和apply
,你必须这样做:
foo.call.apply(foo, [null, 1]);
设置.call
函数的上下文,然后设置它的两个参数。
让我们从一个信息更丰富的"foo"函数开始:
function log() {
console.log('args: ', arguments, ''nthis: ', this);
}
所有函数都具有相同的call
和bind
方法。log.call
是一个函数,作为一个函数它具有与其他函数相同的apply
方法。所以这两个是等价的:
log.apply.call === log.call
log.call === Function.prototype.call
调用此:
log.call.apply(null, [1])
与调用这个相同:
Function.prototype.call.apply(null, [1])
上面调用了window
上的Function.prototype.call
方法,将1
作为唯一的参数传递。
这显然是非常错误的;call
应该只用于函数,而不是窗口对象,并且传递给调用的第一个参数应该是执行范围,而不是1
。
- 使用应用程序状态js和视图在angular js url上传递两个参数
- 如何使用JavaScript's”;应用“;方法,在数组之前添加一个额外的参数
- Function.prototype.call和Function.protoype.all只应用一个参数
- 谷歌应用脚本中的 UrlFetchApp.fetch 删除 url 参数
- 在express应用程序中,请求参数两次附加到URL
- 函数与使用slice的参数一起应用
- 用于Cordova应用程序的Javascript SQLite-使用参数搜索,其中字符串包含子字符串大小写insenst
- 如何传递参数并应用于函数
- 将 URL 参数传递到 Web 应用脚本中
- 谷歌应用脚本以编程方式创建触发器,函数中的参数
- 在应用脚本中,如何在自定义函数中包含可选参数
- JavaScript 部分应用函数 - 如何仅绑定第二个参数
- 如何编写函数,以便内部应用程序隐式接收外部参数
- 当需要(“http”)时发生了什么.Server() 以 Express 应用程序作为其参数进行评估
- 创建新的类实例并将参数应用为数组
- Ramda curry:如何将参数应用于多个参数
- 向AJAX响应添加参数,然后根据返回参数应用操作
- 对筛选器参数应用筛选器
- 将参数应用于函数
- 将自定义参数应用于匿名JavaScript替换函数