removeEventListener - 函数定义本身内的回调?

我有以下代码,在其中向文档添加了一个事件侦听器,然后将其删除。


document.addEventListener("keypress", gameStart);


function gameStart() {

    document.querySelector("h1").innerHTML = "Level 1";

    document.querySelector("h2").style.visibility = "hidden";

    document.removeEventListener("keypress", gameStart);

}

我无法理解如何在 gameStart() 本身的定义中的 removeEventListener 方法中对 gameStart 进行回调。这对我来说似乎是循环的,但我觉得我在这里误解了一些基本的东西。我错过了什么?


慕码人2483693
浏览 156回答 4
4回答

繁花如伊

在removeEventListener文档中我们可以看到:target.removeEventListener(type, listener[, options]); target.removeEventListener(type, listener[, useCapture]);...listener要从事件目标中删除的事件处理程序   的EventListener调用时不会调用该EventListener函数(在您的情况下gameStartremoveEventListener) ,因此没有任何循环调用或递归,它被传递给removeEventListener该函数,因此可以从该事件中注销该函数。

梵蒂冈之花

每个人的答案都很复杂。简单一点:1-您没有gameStart重新调用该函数document.removeEventListener("keypress", gameStart);您实际上是在调用该removeEventListener()函数-现在再读一遍,因为我知道这可能会令人困惑。2-您正在告诉该removeEventListener()功能从您的功能中删除您的按键监听gameStart()器。gameStart 从未在那条线的最后调用自己。3-现实生活中的例子(计算之外):有人打电话给你的电话# xxx-xxx-xxxx 然后你接电话,那个人告诉你做某事(你是 gameStart()) 完成后你想挂断电话,因为你没有其他事情可做或讨论电话里的另一个人,所以你告诉另一个人挂断你的电话,因为否则他们会一直在听电话(另一个人是事件监听器)。你没有挂断电话,你甚至没有参与挂断电话的行动,你只是告诉他们他们需要做什么。我希望这会有所帮助!

蓝山帝景

您始终可以传递您定义的函数的引用,因为函数不必在定义时拥有所有可用的东西,而是在调用时要求。它也是递归的基础。例如function getFactorial(num) {&nbsp; &nbsp; if (num <= 2) {&nbsp; &nbsp; &nbsp; &nbsp; return num;&nbsp; &nbsp; }&nbsp; &nbsp; return num * getFactorial(num - 1);}也许,以下内容将帮助您了解更多:function getType() {&nbsp; &nbsp; return typeof getType;}上述函数将始终返回"function"。另一个怎么样:function getTypeOfX() {&nbsp; &nbsp; return typeof myObj.x;}您将能够定义此函数,但一旦您使用 调用它getTypeOfX(),您将收到错误,因为myObj未在函数定义的外部/全局范围内定义。如果您在控制台中尝试这样做。你可以做var myObj = {&nbsp; &nbsp; x: ""}即使在函数定义之后,getTypeOfX()再次调用以查看它现在打印"string".这里的结论就是上面@Quentin提到的:Variables used inside a function are not evaluated until the function is called.

子衿沉夜

在调用函数之前,不会计算函数内部使用的变量。gameStart因此,可以引用自身,因为它是在调用之前创建的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript