为什么我不能使用.call()调用Function.call函数?

3
在Javascript中,Function.call()可以在给定this值和零个或多个参数的情况下调用FunctionFunction.call本身就是一个函数。因此理论上,Function.call应该与Function.call.call相同(或类似)。
在V8中,这似乎是正确的:
> Function.call === Function.call.call
true

当我们调用Function.call()时,我们会得到一个匿名函数。
> Function.call()
[Function: anonymous]

然而,我无法在Function.call上调用.call()
> Function.call.call()
TypeError: undefined is not a function
at repl:1:21
at REPLServer.defaultEval (repl.js:132:27)
at bound (domain.js:291:14)
at REPLServer.runBound [as eval] (domain.js:304:12)
at REPLServer.<anonymous> (repl.js:279:12)
at REPLServer.emit (events.js:107:17)
at REPLServer.Interface._onLine (readline.js:214:10)
at REPLServer.Interface._line (readline.js:553:8)
at REPLServer.Interface._ttyWrite (readline.js:830:14)
at ReadStream.onkeypress (readline.js:109:10)

这里发生了什么?Function.call显然是一个函数 - 它不像这个错误信息所暗示的那样是undefined

1
不错的问题和答案,尽管在正常的编程环境中没有意义 :) - nicovank
当然,但我正在探索一些JavaScript的“假设情况”,无意中遇到了这个问题。 :) - Qix - MONICA WAS MISTREATED
当然可以! - Bergi
如果你传递一个this值,当然可以。混淆源于错误信息。 - Qix - MONICA WAS MISTREATED
1个回答

4

简短回答:这个错误信息非常误导。它与执行以下操作时收到的错误消息相同:

(undefined)();

更详细的解释:

第二个.call()是使用Function.call作为this来调用的。

如果不带参数地调用它,它将使用undefined作为this值来调用this

因此,实际上你正在做的是

Function.call.call(undefined)

这意味着你(比喻地)正在做某事。
undefined.call()

这实际上只是

undefined()

将空值(或undefined)传递给Function.call.call()this参数,基本上是否定了第一个Function.call()this上下文(它将仅是Function本身),导致在undefined上调用.call()
这会产生以下错误消息:undefined is not a function

1
因此,工作示例将是Function.call.call(Function)Function.call.call(console.log, console, "hello") - Bergi
@Bergi 正确。再次弄混的原因在于“错误信息”。 - Qix - MONICA WAS MISTREATED
2
啊,我没意识到你自己回答了你的问题。我只是认为添加一个工作双“call”用法的例子可能有助于解释。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接