为什么从数组调用时收到非法调用
Why I get an Illegal invocation when invoking from an array?
我一直试图理解函数的这种行为,但我找不到答案。
我试图调用函数数组的每个函数。一切正常,但是当我在数组中输入"提示符"时,出现错误:
未捕获的类型错误:非法调用。
要重现错误,您可以尝试:
[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.
相关文章:
- AJAX调用中的非法调用
- 如何解决这种情况下的非法调用类型错误
- 为什么从数组调用时收到非法调用
- 使用ajax和bootbox进行非法调用
- 未捕获的类型错误:非法调用:模态形式的错误
- 对间谍对象的非法调用
- 非法调用错误 jquery
- $.post投掷”;非法调用”;
- 调用module.exports上的函数时发生CommonJS非法调用错误
- Chrome说我正在使用非法的函数调用
- 使用 Web 音频 API 使用 start/noteOn 进行非法调用
- 为什么这会引发未捕获的类型错误:非法调用
- jQuery ajax Uncatch TypeError: 非法调用
- 什么是非法调用类型JavaScript中的错误
- 在 jquery 中将错误作为非法调用
- 为什么某些函数调用在 JavaScript 中被称为“非法调用”
- JavaScript 中的 getUserMedia() 跨浏览器规范化.非法调用
- Array.prototype.forEach.call 给出 TypeError: 非法调用
- 未捕获的类型错误:发送数据时非法调用
- 未捕获的类型错误:从 ajax 发送数据时出现非法调用错误