我有一个接受匿名函数作为参数的函数,并将其设置为变量(作用域)以供参考。然后我尝试用该引用执行另一个函数,但它显然失败,因为该函数超出了范围。
我想知道是否有人知道将匿名函数作为匿名函数直接传递的简单方法,避免了范围问题?
编辑:为了澄清,el元素是在函数与参数列表隔离后定义的。此外,el元素也是参数列表的一部分。如果只有我使用这个代码,我可能会使用一个两个参数列表,第二个参数是一个数组或哈希对象但不幸的是这个代码将被一些不太熟悉JS甚至编码的人使用就此而言。
感谢您的帮助!
以下是我的代码的相关部分:
locate : function(){
if ((!arguments)||(!arguments.length)) return;
arguments = [].splice.call(arguments,0); //This just converts arguments into an array
for (var i=0;i<arguments.length;i++){
if (typeof(arguments[i])=='function'){
var tf = arguments.splice(i,1);
break;
};
};
if (!tf) return;
JAS.Globals.eventListen('click',el,tf);
}
这是缩写,只是信任el被定义。 JAS.Globals.eventListen只是一个智能的addEventListener。
答案 0 :(得分:3)
var tf = arguments.splice(i,1)
这会将数组返回到tf。 eventListen是否期望一个数组?如果不使用: -
var tf = arguments.splice(i,1)[0]
由于您的其他参数似乎没有任何其他用途,为什么还要使用拼接?
答案 1 :(得分:0)
你可以这样做:
for (var i=0;i<arguments.length;i++){
if (typeof(arguments[i])=='function'){
JAS.Globals.eventListen('click',el,arguments[i]);
break;
}
}
或者如果由于某种原因需要在循环后分配事件:
var tf;
for (var i=0;i<arguments.length;i++){
if (typeof(arguments[i])=='function'){
tf = arguments[i];
break;
}
}
if (!tf) return;
JAS.Globals.eventListen('click',el,tf);
答案 2 :(得分:0)
我不是JS专家,不确定这对您的情况是否有帮助。
但是因为你要求一种方法来“按值”传递一个函数...你可以重新组合函数,使它再次变为匿名,如下所示:
JAS.Globals.eventListen('click', el,
new Function(tf.toString() + tf.name + "();")
最后一部分做的是它从tf.toString()
获得的原始源创建一个新函数,它将打印出具有相同函数名的函数定义代码,但是在about-to-的范围内创造功能。
然后你立即用tf.name + "();"
调用这个函数。
请注意,如果函数没有名称,那么您可以将其作为内联函数调用包装,即:
new Function("(" + tf.toString() + ")();");
包装起来:
new Function(tf.name
? (tf.toString() + tf.name + "();") // func has a name, call by name
: ("(" + tf.toString() + ")();") // func don't have a name, call inline
在Firebug中尝试看看我的意思。