我现在正在开发一个主要是前端UI的项目。
现在我的一个函数遇到问题,其中返回值返回的是函数本身,而不是函数的产生。
我将首先解释预期的结果:
1。)页面上有一个菜单,当单击菜单中的一个按钮时,会使用该按钮将另一个菜单添加到该页面中-我将其称为子菜单。
em>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函数中创建的对象敌人面板;但是,返回的只是函数本身作为字符串。我试图改变:
return test;
到
return test();
但是创建子菜单中的按钮后,所有这些操作都将执行该功能。我只希望在单击按钮时执行它。
我对闭包不太熟悉,所以如果闭包功能出了点问题,阻止它生成所需的输出,我不会感到惊讶。
我愿意接受所有建议。请让我知道你们的想法,谢谢!
答案 0 :(得分:1)
来自enemyPanel
函数的...
test
返回到变量test
...
不,不是。您是将函数本身分配给变量test
,而不是调用它的结果。
有两个问题:
您将错误的函数传递给addEventListener
。应该是test
,由closure
创建的函数,而不是closure
。
add.addEventListener("click", test, false);
您正在从事件处理程序返回enemyPanel
。通过addEventListener
is completely ignored添加的事件处理程序的返回值。¹您不能返回 enemyPanel
。您可以创建它,将其分配给该函数范围内的变量,将其添加到列表等,但是您不能在事件处理程序中的任何地方返回。
¹这是我贫乏的小博客上的帖子。