Javascript 为什么HTML绑定事件处理程序周围的方括号起作用?

Javascript 为什么HTML绑定事件处理程序周围的方括号起作用?,javascript,html,Javascript,Html,考虑以下代码片段 函数func1{ console.log'func1 fired'; } 函数func2{ console.log'func2 fired'; } 单击我它可以工作,因为表达式可以用作JavaScript中的语句。所以它创建函数调用结果的嵌套数组,但不使用这些数组 出于同样的原因,你可以写: function func3() { [[[func1(), func2()]]]; } func3(); 它之所以有效,是因为表达式可以在JavaScript中用作语句。所以

考虑以下代码片段

函数func1{ console.log'func1 fired'; } 函数func2{ console.log'func2 fired'; }
单击我它可以工作,因为表达式可以用作JavaScript中的语句。所以它创建函数调用结果的嵌套数组,但不使用这些数组

出于同样的原因,你可以写:

function func3() {
    [[[func1(), func2()]]];
}
func3();

它之所以有效,是因为表达式可以在JavaScript中用作语句。所以它创建函数调用结果的嵌套数组,但不使用这些数组

出于同样的原因,你可以写:

function func3() {
    [[[func1(), func2()]]];
}
func3();

浏览器将使用属性的文本作为函数的代码,从属性值构造函数。在您的例子中,这将是一个如下所示的函数

function madeByBrowser(event) {
  [[[ func1(), func2() ]]];
}
这是合法的。该函数包含一个表达式,即数组初始值设定项。计算数组初始值设定项的一个副作用是调用这两个函数


实际构造的函数与此不完全相同,而且函数中的代码的隐式范围存在一些奇怪且经常有问题的细节。就这个问题而言,它已经足够接近了。

浏览器将使用属性的文本作为函数的代码,从属性值构造函数。在您的例子中,这将是一个如下所示的函数

function madeByBrowser(event) {
  [[[ func1(), func2() ]]];
}
这是合法的。该函数包含一个表达式,即数组初始值设定项。计算数组初始值设定项的一个副作用是调用这两个函数


实际构造的函数与此不完全相同,而且函数中的代码的隐式范围存在一些奇怪且经常有问题的细节。就这个问题而言,这已经足够接近了。

虽然这是一个非常有趣的问题,可以理解JS在HTML上下文中是如何执行的,但请注意:不要使用onclick,也不要教授onclick。在加载了defer属性yes的脚本中获取JS端的按钮,旧IE版本甚至支持该属性,并使用button.addEventListenerclick。。。取而代之的是,这对Click来说太有效了Me@Mike“Pomax”Kamerman我实际上没有使用这个,也许我应该在问题中指出它。事实上,我在[另一个问题]中发现了这个片段,这激发了我的兴趣。虽然这是一个非常有趣的问题,可以理解JS是如何在HTML上下文中执行的,但从实用角度讲:不要使用onclick,也不要教onclick。在加载了defer属性yes的脚本中获取JS端的按钮,旧IE版本甚至支持该属性,并使用button.addEventListenerclick。。。取而代之的是,这对Click来说太有效了Me@Mike“Pomax”Kamerman我实际上没有使用这个,也许我应该在问题中指出它。事实上,我在[另一个问题]中找到了这个片段,它激起了我的兴趣。谢谢你的回复。对我来说没有意义的是为什么在页面加载时不调用函数func1和func2。简单地编写[func1,func2]会导致立即调用这两个函数,那么为什么在连接到事件侦听器属性时该函数不会立即调用呢?因为在单击之前,onclick中的任何代码都不会运行。为什么您认为这两个函数不同,因为它们在一个数组中?onclick=func1;func2在您单击之前不会运行函数。是的,我想这是有道理的。再次感谢,谢谢你的回复。对我来说没有意义的是为什么在页面加载时不调用函数func1和func2。简单地编写[func1,func2]会导致立即调用这两个函数,那么为什么在连接到事件侦听器属性时该函数不会立即调用呢?因为在单击之前,onclick中的任何代码都不会运行。为什么您认为这两个函数不同,因为它们在一个数组中?onclick=func1;func2在您单击之前不会运行函数。是的,我想这是有道理的。再次感谢。