Javascript [eval]为什么在[eval][0](';代码';)中工作?

Javascript [eval]为什么在[eval][0](';代码';)中工作?,javascript,Javascript,我看到了执行代码的方法: [eval][0]('alert("hello")') 我想知道用方括号括起来的不带引号的“eval”是什么意思,以及为什么这样做。(例如,window['eval'][0]('alert(“hello”))将导致类型错误)。有任何教程描述这种语法吗?无引号的eval用括号括起来是一个数组,其中有一个元素是eval [eval][0]('alert(“hello”)) 表示获取数组的第一个元素[eval],并向其传递'alert(“hello”)。换句话说, ev

我看到了执行代码的方法:

[eval][0]('alert("hello")')  

我想知道用方括号括起来的不带引号的“eval”是什么意思,以及为什么这样做。(例如,
window['eval'][0]('alert(“hello”))
将导致类型错误)。有任何教程描述这种语法吗?

无引号的
eval
用括号括起来是一个数组,其中有一个元素是
eval

[eval][0]('alert(“hello”))

表示获取数组的第一个元素
[eval]
,并向其传递
'alert(“hello”)
。换句话说,

eval('alert(“hello”))


window['eval'][0]('alert(“hello”))


另一方面,尝试获取
窗口['eval']
的第一个元素,该元素不是数组,因此类型错误
window['eval']
eval
相同,除非作用域中有另一个变量名为
eval

未加引号的
eval
是一个包含一个元素的数组,该元素为
eval

[eval][0]('alert(“hello”))

表示获取数组的第一个元素
[eval]
,并向其传递
'alert(“hello”)
。换句话说,

eval('alert(“hello”))


window['eval'][0]('alert(“hello”))


另一方面,尝试获取
窗口['eval']
的第一个元素,该元素不是数组,因此类型错误
window['eval']
eval
相同,除非作用域中存在另一个名为
eval

的变量。示例导致类型错误的原因如下:

window['eval'][0]('alert("hello")')
是因为您遗漏了一组括号,使其等效:

[window['eval']][0]('alert("hello")')

您给出的初始语法构造了一个包含一个元素的数组,即函数eval。因此,此数组的第0个元素是eval函数,该函数使用方括号立即取消引用。

您的示例导致TypeError的原因:

window['eval'][0]('alert("hello")')
是因为您遗漏了一组括号,使其等效:

[window['eval']][0]('alert("hello")')
您给出的初始语法构造了一个包含一个元素的数组,即函数eval。因此,此数组的第0个元素是eval函数,它使用方括号立即取消引用。

这是一个

引述文章:

根据ES5,所有这些都是间接调用,应该执行 全局范围内的代码

因此,您可以使用这些“技巧”在全局范围而不是当前范围内执行
eval

它在
[eval]
是一个数组之前工作,其中它的第0个元素是
eval
函数,即
[eval][0]==eval
,您将通过字符串
'alert(“hello”)
作为参数调用它。

这是一个

引述文章:

根据ES5,所有这些都是间接调用,应该执行 全局范围内的代码

因此,您可以使用这些“技巧”在全局范围而不是当前范围内执行
eval

它在
[eval]
是一个数组之前工作,它的第0个元素是
eval
函数,即
[eval][0]==eval
,调用它时将字符串
'alert(“hello”)
作为参数。

[x]
是包含
x
的一个元素的列表。因此

[x][0]
这只是一种冗长而低效的表达方式

你的榜样

[eval][0]('alert("hello")')
所以就是

eval('alert("hello")')
这种欺骗通常存在于Javascript特洛伊木马或病毒中,作者试图掩盖正在发生的事情

然而,Javascript充满了特殊情况,当与
eval
一起使用时,代码还可以具有强制全局求值而不是局部求值的含义

function defun(s) { [eval][0](s); }
function defun2(s) { eval(s); }

defun2("function square(x){return x*x}")
---> undefined

square(12)
---> ReferenceError: square is not defined

defun("function square(x){return x*x}")
---> undefined

square(12)
---> 144
有关详细信息,请参见Matteo Tassinari答案链接(请注意,链接的文章有点过时,因此请忽略有关webkit行为的详细信息)。

[x]
是包含
x
的一个元素的列表。因此

[x][0]
这只是一种冗长而低效的表达方式

你的榜样

[eval][0]('alert("hello")')
所以就是

eval('alert("hello")')
这种欺骗通常存在于Javascript特洛伊木马或病毒中,作者试图掩盖正在发生的事情

然而,Javascript充满了特殊情况,当与
eval
一起使用时,代码还可以具有强制全局求值而不是局部求值的含义

function defun(s) { [eval][0](s); }
function defun2(s) { eval(s); }

defun2("function square(x){return x*x}")
---> undefined

square(12)
---> ReferenceError: square is not defined

defun("function square(x){return x*x}")
---> undefined

square(12)
---> 144

有关详细信息,请参阅Matteo Tassinari回答链接(请注意,链接的文章有点过时,因此请忽略有关webkit行为的详细信息)。

您可能希望包括为什么可以这样做,而不仅仅是简单的
eval()
调用。根据,
eval(“code”)
是一个直接eval调用(在调用方的范围内执行)和
[eval][0](“code”)
是一个在全局范围内执行的间接调用。但是为什么会发生这种情况呢?至于我,我不知道……你可能想包括为什么可以这样做,而不仅仅是一个普通的
eval()
调用。根据,
eval(“code”)
是一个直接eval调用(在调用方的范围内执行)和
[eval][0](“code”)
是一个在全局范围内执行的间接调用。但是为什么会发生呢?至于我,我不知道……还要注意,
[alert][0]('test')
给出了一个
类型错误:非法调用
。这是因为
alert
中通常绑定到
窗口的
This
在这样调用时没有绑定(alert.
[alert.bind(window)][0]('test')
没有错误。另外,查看一个示例,说明为什么要在全局范围内执行
eval
。@lyrichy-wicked:您应该将Matteo的答案标记为正确答案…这是最好的答案。还请注意,
[alert][0]('test')
给出了一个
类型错误:非法调用