这种奇怪的JavaScript数组语法是什么?

这种奇怪的JavaScript数组语法是什么?,javascript,syntax,Javascript,Syntax,我在搜索google和stackoverflow时遇到一些问题,无法找到这段JavaScript代码的答案: obj['e'+type+fn]( window.event ); 在我看来,这就像一个带有参数的数组元素: array[index](argument); 然而,我只能猜测这是在做什么。这是否等于: array[index]=argument 哪个是为数组元素指定参数 如果有人能提供一个简单/通用的例子来说明这是怎么做的,那就太好了。 我正试图破译。我并不是真的在寻找这个实现的解

我在搜索google和stackoverflow时遇到一些问题,无法找到这段JavaScript代码的答案:

obj['e'+type+fn]( window.event );
在我看来,这就像一个带有参数的数组元素:

array[index](argument);
然而,我只能猜测这是在做什么。这是否等于:

array[index]=argument
哪个是为数组元素指定参数

如果有人能提供一个简单/通用的例子来说明这是怎么做的,那就太好了。
我正试图破译。我并不是真的在寻找这个实现的解释或与之相关的示例,而是更像是一个简化的示例,它使用了一些想象中的产品

这就是它所做的:

obj['e'+type+fn]( window.event );
从数组
obj
,它采用索引
'e'+type+fn
的函数。然后,它将
window.event
作为一个参数来执行它

obj['e'+type+fn]( window.event );

请记住,
()
调用函数,并从数组中提取值。

obj['e'+type+fn]
返回函数类型。然后使用
window.event
作为参数执行此操作

obj['e'+type+fn]( window.event );
这只是访问对象属性的一种方式。例如,如果您有一个对象

a = {
 name: 'someName'
 age: 20
};
您可以使用
a.name
或如上
a['name']
访问name

他使用
[]
符号的原因是,他可以从多个字符串构建密钥

因此,如果
type=click
fn=foo
他正在访问
obj.eclickfoo
。或
obj['eclickfoo']

对象的这个属性必须是一个方法,因为他使用()调用它;他又说:

obj.eclickfoo( window.event );
或同等品

obj['eclickfoo']( window.event );
数组确实可以使用“obj[…]”符号,但JavaScript中的任何对象也可以使用。在本例中,Resig将属性添加到任何对象,特别是DOM对象

obj['aVar']
相当于
obj.aVar
。前者的优点是,它还可以处理JavaScript中保留的具有特殊含义的关键字(例如,如果在对象上定义了名为“var”的属性,则为obj['var')),并允许动态访问属性名称,如示例所示。由于
type
是一个变量,因此无法执行
obj.type
,因为这将查找一个名为“type”的属性,而不是查找一个名称等于
type
变量值的属性

由于对象(或数组)可以将函数作为数据保存,因此您还可以对对象或数组内部的函数使用调用运算符(匹配的括号),如下所示——访问属性(这是以前存储在对象上的“方法”或函数)然后将
window.event
对象作为单个参数调用

函数在其原型上也有一个内置的
toString
方法(在这种情况下,如果要连接到字符串,则会调用该方法,因此必须需要字符串,只要不在函数上设置自己的
toString
方法,因为函数也是JavaScript中的对象!)。Resig的代码利用了这一点,定义了一个新的属性,有些随意,这通常是一个坏主意,但以一种不太可能与其他也添加了这样一个属性的应用程序发生冲突的方式


因此,如果
document.body
obj
,如果
type
变量设置为“click”,而“fn”设置为
function(){alert('boo!');}“
,它实际上会将document.body对象上的一个属性命名为“eloadfunction(){alert('boo!');}”(然后在他自己的匿名函数中调用它),允许使用函数中使用的任何“this”关键字的正常行为调用函数--
this
将引用父对象,在这种情况下
obj
,而不是全局对象(除非
obj
是全局对象,即
窗口
对象).

这与运行类似于
obj.esome\u typesome\u函数(window.event)
的操作相同,不同之处在于您所询问的符号允许您动态地组合属性名称。