为什么从数组调用时收到非法调用

Why I get an Illegal invocation when invoking from an array?

本文关键字:调用 非法 数组 为什么      更新时间:2023-09-26

我一直试图理解函数的这种行为,但我找不到答案。

我试图调用函数数组的每个函数。一切正常,但是当我在数组中输入"提示符"时,出现错误:

未捕获的类型错误:非法调用

要重现错误,您可以尝试:

[prompt][0]()

这段代码会起作用,我也无法解释为什么没有:

[function() { return prompt }][0]()()

我知道有几种方法可以解决这个问题,但我想了解发生了什么。

多谢!

有关背景,请参阅"this"关键字如何工作?。

prompt函数要求this window,如果您调用window.prompt()或(因为window是默认上下文(prompt(),则会如此。

但是,当您调用 [prompt][0]() 时,this 是数组对象。

因此,错误不是因为它在数组中,而是因为它没有在window的上下文中调用。

您可以显式传递上下文:

[prompt][0].apply(window)

实际上prompt是一个原生函数,并且它期望它内部的this必须window,但是当你从数组中提取它并调用它时,它会将它内部的this作为存储数组对象。因此,这是非法的,并且出现了错误。

一个示例供您了解,

function test(x){ 
 console.log(this === x) 
}
var x = [test];
x[0](x); //true
因此,从

上面的代码中,您可以理解从数组中提取的函数内部this将指向数组本身。

为此有很多工作要做,但在我看来,最易读的是使用 call .

[prompt][0].call(window) //`this` object of prompt in this would be window.