不可以。该参数e
仅适用于直接定义在内部的代码whatever()
或您传递引用的任何函数。它不适用于从内部调用的函数,whatever()
除非您将其传递给它们。
这是您问题中在所有浏览器中都失败的代码的确切实现:http: //jsfiddle.net/jfriend00/ReNKU/
至于解决方案,您可以使用本地函数,然后e
像这样对其他两个函数可用,因为它们是在以下范围内定义的whatever()
:
function whatever (e) {
function stuff() {
// e is available here
thingy();
}
function thingy() {
// e is available here
}
// e is available here
stuff();
}
或者,您可以将它作为参数传递给您的每个原始函数:
function whatever (e) {
stuff(e);
}
function stuff(e) {
thingy(e);
}
function thingy(e) {
}
这个关于函数参数可用的问题与 Firefox 无关,因为这是一个 JavaScript 实现选择,在任何地方都是一样的。
如果您的特定代码恰好在其他一些浏览器中工作,那么显然有一个名为的全局变量e
或e
在它正在拾取的其他父上下文中,并且恰好在其中具有正确的值,但事实并非e
如此来自你的whatever(e)
声明。无论如何,依赖这种隐含的行为是不好的。
如果您希望参数 e 可用于其他两个函数,那么您有两个不错的选择:
- 将其作为参数传递给他们。
- 在范围内定义这些函数,
whatever(e)
以便他们可以直接看到参数。
如果您真正想做的是访问在事件处理程序中发生的事件,那么您真的只需要知道这一点:
如果您使用.addEventListener()
,则事件数据结构将作为第一个参数传递给事件处理程序。.addEventListener()
在包括 IE9 在内的所有支持的浏览器中都是如此。如果您.attachEvent()
在旧版本的 IE 中使用,则事件数据结构在全局变量中window.event
,您可以在那里访问它。在您的事件处理程序启动时,如果您想让此数据结构可用于您调用的其他函数,您应该将其作为参数传递给它们。然后,他们的行为将完全是浏览器安全的。
这是一个快速的跨浏览器事件注册函数,它也处理事件差异:
// add event cross browser
function addEvent(elem, event, fn) {
if (elem.addEventListener) {
elem.addEventListener(event, fn, false);
} else {
elem.attachEvent("on" + event, function() {
// set the this pointer same as addEventListener when fn is called
// and get the event data structure from the global variable and
// pass it to the event handler
return(fn.call(elem, window.event));
});
}
}