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非常感谢。我几乎失去了所有的希望。很高兴我能在某种程度上提供帮助。两种方法非常相似。