Javascript MOOTOOLS变量范围

Javascript MOOTOOLS变量范围,javascript,variables,scope,mootools,closures,Javascript,Variables,Scope,Mootools,Closures,我正在使用mootools: 在使用addEvent时,我不知道如何使用变量 我想使用for next循环来设置循环中的值: for (x=0;x<num;x++){ var onclickText = 'function (){onclick="addPageMoveEvent('+x+'"); }'; $('pageNum'+x).addEvent('click', onclickText); } (x=0;x)的 我搜索过论坛,但没有找到任何帮助 任何帮助都会很好 谢谢警告:第一个

我正在使用mootools: 在使用addEvent时,我不知道如何使用变量

我想使用for next循环来设置循环中的值:

for (x=0;x<num;x++){
var onclickText = 'function (){onclick="addPageMoveEvent('+x+'"); }';
$('pageNum'+x).addEvent('click', onclickText);
}
(x=0;x)的

我搜索过论坛,但没有找到任何帮助

任何帮助都会很好


谢谢

警告:第一个示例无效!请继续阅读以获取解释。

你把
onclick
HTML语法与MooTools
addEvent
混淆了。试试看

for (var x=0;x<num;x++){
    $('pageNum'+x).addEvent('click', 'addPageMoveEvent('+x+');');
}
这使用了一个工厂来创建包含
x
值的闭包……相当复杂的代码,但这是最纯粹的方法。它还避免了使用可怕的
eval
,因为您输入了
addEvent
字符串(看起来MooTools无论如何都不喜欢其他选项)MooTools中的方法接受两个参数:

myElement.addEvent(type, fn);
参数:

  • 键入-(string)要监视的事件名称(“单击”、“加载”等),不带前缀“on”
  • fn-(函数)要执行的函数
它不接受字符串,而传递字符串,例如
“myFunction()”
“function(){myFunction();}”
将不起作用

由于您位于循环中,并且变量
x
将共享环境,因此需要将其值包装到另一个闭包中。一种方法是使用其他闭包:

$("pagenum" + x).addEvent("click", (function(value) {
    return function() { addPageMoveEvent(value); }
})(x));
有关在循环中创建闭包的特殊问题,请参阅StackOverflow上的所有内容


同样值得一看的是这篇MDC文章-

,它是mootools pass方法的一个用例

for (x=0;x<num;x++){
  $('pageNum'+x).addEvent('click', addPageMoveEvent.pass(x));
}

for(x=0;x)到底出了什么问题?首先,
for(x=0;x)不理解“var”问题。我认为var只是关于变量的作用域,即全局变量还是非全局变量。为什么会有区别?因为如果它是全局变量,并且没有得到足够的注意,则此代码的所有调用都会创建对
x
的引用,导致每个链接都这样做。如果
x
是局部变量,则其值不会保留,即引用将被创建为不同的名为
x
的东西。但是随着闭包的增加,这其实并不重要。谢谢,我尝试了纯主义的方法,它工作了!!谢谢。你能证实我的理解吗。我认为它添加了工厂(0)工厂(1),然后它调用工厂值作为x?如果我理解正确,可以。例如,它调用
factory(1)
factory
执行并返回一个函数,该函数在执行时调用
addPageMoveEvent(1)
。然后将此函数传递到
addEvent
调用中。当事件触发时,将调用此函数,从而进行right
addPageMoveEvent
调用。本质上,
factory
是一个函数工厂函数,它生成一个调用传递变量th值的另一个函数的函数at已传递给工厂…请仔细阅读几次:)希望这能有所帮助。哎呀,我习惯了更灵活的jQuery。我会更新我的答案。我喜欢MooTools胜过任何其他框架,但我越来越觉得它相当僵硬。谢谢@MvanGuest:)老实说,我以前没有见过或没有见过像jQuery这样的速记函数接受字符串的可执行JavaScript代码。奇怪。我一定在什么地方见过类似的东西,MooTools和jQuery是我唯一熟悉的框架……如果我找到了,我会告诉你。
for (x=0;x<num;x++){
  $('pageNum'+x).addEvent('click', addPageMoveEvent.pass(x));
}