2016-10-01 104 views
1

为什么下面的匿名JS函数有“e”作为参数?我知道这是事件,但它是如何保存的?在这个事件监听器和它使用的处理器中,没有任何地方提到这个“e”。事件监听器的匿名函数

document.body.addEventListener("keyup", function(e) { 
keys[e.keyCode] = false; 
}); 
+0

'e'是一个参数是通过调用函数传递时,事件被触发。试着认为某处有一个地方有'body'元素中'keyup'事件的所有功能。每当这个事件触发时,这个函数就会像'callback(eventFired)'一样。 –

+0

好,所以在这里工作时有一个类似于默认或通用库的东西,而名为“而不是”的函数是匿名的需要这个参数,我知道它是正确的吗? –

+0

您的代码运行在浏览器上,负责处理该问题。在这种情况下,它不是像“它需要”那样的一个论点。这取决于你是否使用它。调用者将添加它想要的回调函数的任何参数(在本例中为'event'),所以你可以通过在你提供的函数中放置一个参数来使用它。 –

回答

0

请记住,匿名函数被称为发生事件的时刻。匿名函数说:“嘿,当你给我打电话时,一定要给我一个参数。”因此,当事件发生时,浏览器将使用一个参数来调用该匿名函数,该参数将成为事件对象。事件对象是在事件发生时创建的。

+1

命名参数的存在不会改变浏览器的行为。事件对象将始终传递给处理程序。 – Andreas

+0

谢谢你的澄清。我意识到这一点,但是我想把技术噪音排除在我的反应之外,以便专注于作者提出的问题。 – kevin628

+0

恩,谢谢你们,这让我对事情非常清楚,所以这意味着它不一定是“E”,我可以使用任何我喜欢的占位符? –

0

方法addAventListener将函数作为其输入,然后在发生事件时使用事件对象调用此函数。

增加了一个简单的例子来说明这一点。

function EventCreator() { 
 
    var listeners = []; 
 
    var counter = 0; 
 
    setInterval(function() { 
 
    counter++; 
 
    listeners.forEach(function(listener) { 
 
     listener(counter); 
 
    }); 
 
    }, 1000); 
 

 
    this.addListener = function(listener) { 
 
    listeners.push(listener); 
 
    }; 
 
} 
 

 
var eventCreator = new EventCreator(); 
 

 
eventCreator.addListener(function(e) { 
 
    console.log("An event has occured: ", e); 
 
});

文档:https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener

+0

感谢兄弟,但只是一个问题,为什么在设置的时间间隔函数内的addlistener函数?每次运行时都不需要运行? –

+0

添加侦听器函数只是将侦听器附加到列表。当一个事件发生时,你通过听众列表并且用新事件(在这个例子中是计数器)逐个调用它们。作为参数发送给addListener的函数不会立即调用,它将存储在列表中直到事件发生,然后调用它。 – knutesten

+0

okaaaaaay非常感谢! –