1

我有一个函数,它接受一个匿名函数作为参数并将其设置为一个变量(范围)以供参考。然后我尝试使用该引用执行另一个函数,但它显然失败了,因为该函数超出了范围。

我想知道是否有人知道将匿名函数作为匿名函数直接传递的简单方法,避免范围问题?

编辑:为了澄清, 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。

4

3 回答 3

3
 var tf = arguments.splice(i,1)

这会将一个数组返回到 tf. eventListen 是否需要一个数组?如果不使用:-

 var tf = arguments.splice(i,1)[0]

既然您的其他论点似乎没有任何其他用途,为什么还要使用 splice 呢?

于 2009-01-09T16:43:49.873 回答
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);
于 2009-01-09T16:37:49.323 回答
0

我不是 JS 专家,不确定这是否对您有帮助。

但是由于您要求一种“按值”传递函数的方法......您可以重新组合该函数,使其再次变为匿名,如下所示:

JAS.Globals.eventListen('click', el,
    new Function(tf.toString() + tf.name + "();")

最后一部分所做的是它从获得的原始源中创建一个新函数,从该源tf.toString()中将打印出具有相同函数名称的函数的定义代码,但在即将创建的函数的范围内。

然后你立即用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 中尝试一下,看看我的意思。

于 2009-01-09T16:52:16.503 回答