Javascript-返回返回函数的值

Javascript-返回返回函数的值,javascript,scope,closures,return-value,return-type,Javascript,Scope,Closures,Return Value,Return Type,我现在正在做一个项目,主要是前端UI 现在我的一个函数遇到了一个问题,返回值是返回函数本身,而不是函数的结果 我将首先解释预期结果: 1.)页面上有一个菜单,当单击菜单中的按钮时,另一个菜单会添加到页面中,并带有自己的按钮-我将其称为子菜单 2.)单击子菜单中可用的按钮时,会创建另一个菜单并将其添加到页面其他位置的列表中 我将在下面解释我的代码以及问题所在: 1.)此处是创建菜单按钮的位置: var add = document.createElement('button'); 2.)在这里,

我现在正在做一个项目,主要是前端UI

现在我的一个函数遇到了一个问题,返回值是返回函数本身,而不是函数的结果

我将首先解释预期结果

1.)页面上有一个菜单,当单击菜单中的按钮时,另一个菜单会添加到页面中,并带有自己的按钮-我将其称为子菜单

2.)单击子菜单中可用的按钮时,会创建另一个菜单并将其添加到页面其他位置的列表中

我将在下面解释我的代码以及问题所在:

1.)此处是创建菜单按钮的位置:

var add = document.createElement('button');
2.)在这里,我将事件侦听器添加到上面的按钮:

closure = (function(arrayItem) 
{
    var test = function(event)
    { 
        object.spaces.push(selectedSpace.id);
        object.spaceobjects.push(selectedSpace);

        var enemyPanel = addEntityPanel(roomnumber, selectedSpace.id, object, object.savelocation, true);

        return enemyPanel ;
    };

return test;

})(arrayItem);

add.addEventListener("click", closure, false); 
我使用了变量闭包,并出于闭包原因将其传递给了匿名函数,这样就可以通过for循环修改变量arrayItem

您可能会注意到函数addEntityPanel,该函数创建我所指的菜单并将其添加到列表中,它还返回一个对象,其中包含用于创建菜单的所有html元素-将其存储在变量
enemyPanel

测试函数中的
enemyPanel
返回变量
test
,测试返回变量
closure
,该变量应允许我访问addEntityPanel函数中创建的对象enemyPanel;然而,返回的只是作为字符串的函数本身。我试图改变:

return test;

但所有这些都是在创建子菜单中的按钮时执行该功能。我只希望在单击按钮时执行它

我对闭包不太熟悉,所以如果闭包函数有什么问题阻止它生成所需的输出,我不会感到惊讶

我愿意接受任何建议。请让我知道你们的想法,谢谢

enemyPanel
test
函数返回变量
test

不,不是。您将函数本身分配给变量
test
,而不是调用它的结果

有两个问题:

  • 您将错误的函数传递给
    addEventListener
    。它应该是
    test
    ,由
    closure
    创建的函数,而不是
    closure

    add.addEventListener("click", test, false);
    
  • 您正在从事件处理程序返回
    enemyPanel
    。通过
    addEventListener
    添加的事件处理程序的返回值。ª您不能将
    enemyPanel
    返回到任何内容。您可以创建它,将它分配给该函数作用域中的变量,将它添加到列表中,等等,但不能从事件处理程序中的任何位置返回它



  • 这是我贫血小博客上的一篇帖子。

    @JonathanHinds-抱歉,完全错过了这一点,以及你在用
    结束时所做的事情。已修复。您想如何处理
    enemyPanel
    ?在
    关闭
    中,您无法对其执行任何操作;单击时,
    closure
    已经返回。我有一个单独的switch语句,它将对象传递到addEntityPanel,该语句从函数中获取enemyPanel,并根据对象的“type”属性将其他子对象追加到。我可以创建和附加enemyPanel,但如果没有访问权限,我不能向enemyPanel附加任何内容。-我现在正在运行一些测试,看看是否有其他方法可以访问enemyPanel。将该逻辑放入一个函数中,并从事件处理程序调用该函数,传入该面板。
    add.addEventListener("click", test, false);