在for循环中定义函数

时间:2014-03-02 10:42:07

标签: javascript jquery for-loop mathjax

我准备了一个JsFiddle来解释我的问题,就是这样:http://jsfiddle.net/3tAZ7/1/

所以,基本上我正在尝试将处理程序附加到每个mathjax渲染对象,以便当我单击其中一个时,调用函数“jax_remove”。

问题是无论我点击什么mathjax元素,它都会删除最后一个mathjax元素!

这是我正在使用的功能:

setTimeout(function() { //timeout is necessary for mathjax loading
    jaxes = MathJax.Hub.getAllJax("math");
    for(var i = 0; i < jaxes.length; i++) {
        var jax=jaxes[i];
        alert(jax.inputID);
        $("#"+jax.inputID+"-Frame").click(function() {                     
            jax_remove(jax);
        });
    };
},1250);

如果你检查DOM,你可以看到每个渲染的mathjax都包含在一个id为“MathJax-Element-n-Frame”的范围内,其中n = 1,2,3,...所以这些是我附加处理程序的元素,它似乎工作,证据是出现的两个初始警报。

所以问题似乎是在“jax_remove”函数的链接中。

你能帮帮我吗?

2 个答案:

答案 0 :(得分:3)

变化:

  $("#"+jax.inputID+"-Frame").click(function() {                     
        jax_remove(jax);
  });

为:

  $("#"+jax.inputID+"-Frame").click( (function(j) {                     
        return function(){ 
           jax_remove(j);
        };
  })(jax) );

有关解释,请查看@Arun P Johny的链接。

答案 1 :(得分:1)

为降低复杂性,请考虑使用Function.prototype.bind()

$("#"+jax.inputID+"-Frame").click(jax_remove.bind(null, jax));

Fiddle