Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何处理内联处理程序?_Javascript_Inline_Handlers - Fatal编程技术网

Javascript 如何处理内联处理程序?

Javascript 如何处理内联处理程序?,javascript,inline,handlers,Javascript,Inline,Handlers,我怀疑内联处理程序是evalled,但找不到任何相关信息。出于好奇:有人知道这些处理程序是如何处理的吗?为清楚起见,我指的是内联处理程序,如: <a href="#" onclick="doSomethingReallyCunning()">...</a> <input type="checkbox" onmouseover="this.checked=!this.checked;this.blur()"/> 等等。在内部,内联事件属性是通过创建一个匿名

我怀疑内联处理程序是
evalled
,但找不到任何相关信息。出于好奇:有人知道这些处理程序是如何处理的吗?为清楚起见,我指的是内联处理程序,如:

<a href="#" onclick="doSomethingReallyCunning()">...</a>
<input type="checkbox" onmouseover="this.checked=!this.checked;this.blur()"/>


等等。

在内部,内联事件属性是通过创建一个匿名包装函数来处理的,如下所示:

element.onclick = new Function("event", onclickAttribute);
// etc.
这意味着属性的内容是
eval
ed的,但只有当元素插入到DOM中时(在此之后,函数在内存中以解析形式存在,就像其他事件处理程序一样)。这意味着它不会比在您自己的单独JavaScript代码中分配的事件处理程序消耗更多的内存和时间。即使每次事件发生时都必须对代码进行解析,也不会有太大的区别,以至于用户会注意到它


然而,有一个很好的理由不使用内联事件属性:保持表示和逻辑彼此分离,这可以提高可读性和可维护性。另一个优点是,使用minifier不那么痛苦,因为JavaScript文件中的函数名可能会根据minifier的设置和智能而改变,但不会在标记中改变(解决此问题的方法是在代码中定义这些函数时使用方括号表示法(如
窗口)['doSomethingReallyCunning']=function(…){…
),因此函数名将保持不变;但是,如果有更好的解决方案,这当然不是一个整洁的解决方案。如果您仅通过直接引用函数在代码中分配事件处理程序,则该函数名的所有实例都将更改(当然,
setTimeout
setInterval
的参数也是如此。)

我想这是以前问过的问题,但我找不到它。属性的内容被获取,并创建了一个新函数,其中包含此主体和
事件
作为参数(至少在与W3C兼容的浏览器中).这是你想知道的吗?或者更详细一些?我也找不到,不是在SO上,也不是在google上。如果创建了一个新功能,我想我们可以确认正在进行评估?这实际上就是我想知道的。如果是的话,我想说的是反对使用这种内联处理程序的论点。那么
eval
ed到底是什么意思?为什么会有问题?恶意代码的注入?它当然会被解释,但你的意思是“这段代码什么时候被解释,在解析时还是在运行时?”@Marcel Korpel:我是说解析时,问题是每次调用这样的处理程序时,都会产生一个新的解释器(“编译器”)-这是关于速度和内存的问题。谢谢你的回答。结构和逻辑(或结构和行为)的分离我知道,但是minifier参数也是一个很强的参数。函数名在代码中可能会被更改,所以如果使用第三方脚本并引用该内联函数,它就是同一个参数。我已经多年没有使用内联处理程序了,但在几天前问了一些so问题之后,它的机制就不安全了。@Kooilnc:如果是,是哪一个我可以问一下吗?