Javascript JS:匿名函数中的变量继承-作用域

Javascript JS:匿名函数中的变量继承-作用域,javascript,scope,anonymous-function,Javascript,Scope,Anonymous Function,长话短说: var o="before"; x = function() //this needs to be an anonymous function { alert(o); //the variable "o" is from the parent scope }; o="after"; //this chages "o" in the anonymous function x(); //this res

长话短说:

var o="before";
x = function() //this needs to be an anonymous function
{
  alert(o); //the variable "o" is from the parent scope
};
o="after"; //this chages "o" in the anonymous function

x();
//this results in in alert("after");
//which is not the way i want/need it
实际上,我的代码要复杂一些

我的脚本遍历许多html对象,并为每个元素添加一个事件侦听器

为此,我为每个元素声明一个匿名函数,并调用另一个ID为参数的函数。在本例中,该ID由“o”-变量表示

经过一番思考,我明白了为什么会是这样,但是有没有一种方法可以让js在声明匿名函数时计算o,而不用处理id属性并从中获取id

我的完整源代码如下:


匿名函数位于第303行。

您可以尝试使用如下自调用函数:

var o = 0;
for(var i=0;i<elements.length;i++){
    (function(obj,variable){
        obj.onclick = function(){
            alert(variable);
        }
    })(elements[i],o);
    o++;
}
var o=0;

对于(var i=0;i您需要创建变量
o
的闭包。您可以通过分配接受值的函数返回使用该值的函数来完成此操作。您的示例可以这样修改以获得所需的效果:

var o="before";
x = function(inner) {
    return function()
    {
      alert(inner);
    }
} (o); //here, the anonymous function is called, which will return another function which uses o
o="after";

x();//prints "before"
有关更详细的描述,请参见,其中有一节介绍如何将闭包与循环一起使用

同样的技术也可以应用于您的循环中。您希望这样做:

var fn = function(x, y) {
    return function() {
        rr_download_start(x, y);
    }
} (i, this);
link.addEventListener('click', fn ,false);
一种方法是创建函数:

function curry(fun, arg) {
  return function() {
    return fun(arg);
  };
};

// start loop 
var o="before";
x = curry(function(o) {
  alert(o);
}, o);
o="after";

x(); // "before"
另一种方法是使用外部数据源-因为
这取决于调用函数的位置,所以可以将值存储在绑定处理程序的DOM节点中。这种方法可以使用单个函数,而不是许多匿名函数。这种技术有一些注意事项(循环引用在IE6中可能导致内存泄漏),但框架可以有一个干净的包装,例如在jQuery中,您可以编写:

function doStuff() {
  alert($(this).data('o'));
}

// start loop
var o="before";
someDomElement.data('o', 'before');
someDomElement.bind('someEvent', doStuff);
o="after";

someDomElement.trigger('someEvent'); // "before"

这绝对是问得最多的Javascript问题!如果这样做,可能会有点困惑,但是可以使
x=function(o){return function(){alert(o);}}(o)
同样,这样变量的名称就不会改变…是的,它与tau的解决方案非常相似:匿名函数中的匿名函数。我没有尝试过这个方法,但我确信它也能工作!他的解决方案只是我需要的多一点。所以…我先尝试了另一种方法,因为这一种看起来有点困难。但是…它能工作!!t非常感谢。我几乎失去了所有的希望。很高兴我能在某种程度上提供帮助。两种方法非常相似。