javascript

时间:2016-02-04 16:46:31

标签: javascript scope callback

问题

由于下面的(为什么),我需要使用参数填充函数调用表,当用户在网页窗口中单击可变数量的UI项时,这些参数用作回调。 / p>

我知道有两种方法可以做到。一个人工作,而且非常笨拙,一个人没有,但如果可以做到的话会非常干净。

什么有用

所以以下工作完美,want_details()不同地收到1和2,但这种方法对于许多函数来说是一个笨重的混乱(我需要50个):

window.onload = loadPage
var dy_details_functions = [];

dy_details_functions['cb_itemOptions1'] = function () { want_details(1); }
dy_details_functions['cb_itemOptions2'] = function () { want_details(2); }
...
dy_details_functions['cb_itemOptions50'] = function () { want_details(50); }

什么不起作用

虽然为了清晰,简洁和脚本大小而采用以下方法,并不能按预期工作:

window.onload = loadPage
var dy_details_functions = [];

function pop_details()
{
var i;
    for (i=1; i<51; i++)
    {
        dy_details_functions['cb_itemOptions'+String(i)] =
            function () { want_details(i); }
    }
}

上面的结果是函数在表中创建,当我需要它们时它们被正确调用,但是在循环完成后参数设置为i的值。

另外,正如一个更普遍的问题,我认为特别的是我被宣布为函数的本地。如果它在函数执行时被分配给来自全局命名空间的函数调用...为什么它仍然是51?我做了其他事情(据说)本地&#34;我&#34;在此运行之后但在调用函数之前的变量,但它是此函数中的3,它最终作为这两个函数的参数。如果我做1 ... 50,那就是51.如果我做1..41,那么它是42.它肯定是本地i的终止增量值,最终作为所有参数的功能。为什么?)

为什么我需要这个

这一切都是为了解决我无法找到让回调接收任何启动它的DOM项目知识的方法的问题。如果有一个解决方案,那么我不需要上面的某种形式,我的大部分编码都会变得更加容易。 :)

更多详情

下面的评论谈论了一个&#34;事件处理程序&#34;。当我说回调时,以下就是我的意思。我正在这样做,因为我在各种情况下动态创建要点击的东西......

// oi_detailsN objects already added to page prior to this
// callername is 'cb_itemOptions'
for (i=1; i<51; i++)
{
    mycall = callername+String(i);
    sname = "oi_details"+String(i);
    document.getElementById(sname).onmousedown = dy_details_functions[mycall];
}

单击对象时调用回调就好了,上面的笨拙形式1导致我需要发生的事情。我现在明白表单2并不好,因为在函数中声明的JS变量实际上不是本地的(!)

0 个答案:

没有答案