【问题标题】:Cast from object to function从对象转换为函数
【发布时间】:2020-01-26 01:23:19
【问题描述】:

假设我有一个表单的javascript函数:

function(){alert("blah");}

假设我还有一个小程序,它有一个名为 doStuff 的方法,该方法将函数作为参数:

MyApplet.doStuff(function(){alert("blah");});

现在假设小程序根据其计算结果将函数传递给成功或失败的 javascript 回调函数。在那个回调函数中,我想执行该函数,以便用户得到我非常有用的“废话”消息:

function callback(func) {
  func();
}

但是,在上面的示例中,func 不再被视为“function”类型(typeof func 将返回“object”)。是否可以将 func 转换为函数以便可以执行?我有很多技巧可以给我想要的东西,但是它们非常丑陋,我希望我错过了一些简单的东西。

非常感谢任何帮助。

【问题讨论】:

  • 我不明白。 callback 本身是如何传递的?
  • 小程序传递的这个对象的内容是什么?你可以在萤火虫中检查它吗?如果它有call()apply() 函数,你可以尝试调用它们。
  • 回调函数本身的名称作为参数传递给小程序。从那里,我使用 java 插件 (netscape.javascript.JSObject) 中的 JSObject 来调用它并传递一个包含参数的对象数组。

标签: javascript


【解决方案1】:

试试 func.call()

【讨论】:

  • 如果可行,那么 typeof func 将是 "function",而不是像 OP 场景中的 "object"
  • 我尝试了 func.call() 和 func.apply() 都没有成功。
  • 您是否使用 FireBug(或其他调试器)单步执行了代码?您上面的陈述表明您的函数不应转换为对象;确切地知道这个函数何时不再是一个函数可能会很有启发性。
  • 当 JSObject.call() 方法触发时,函数正在转换。它接受一个表示回调函数参数的对象数组。
  • 那么,如果你的 JSObject 是 func,那么框架会调用你的 func 吗?与其将 func 传递给 doStuff,不如传递一个包含 func 的对象,怎么样?然后调用 obj.func()?
【解决方案2】:

使用与您已有的相同样式代码,以下应该会提示“被调用!”:

function callback(func){
  func();
}
callback(function(){
  alert("called!");
});

是 MyApplet.doStuff(function(){alert("blah");});确定将其参数原封不动地传递给回调函数?

【讨论】:

  • 是的,从小程序到回调函数,参数在内容上没有变化。唯一的变化是现在 javascript 将其解释为对象而不是函数。
【解决方案3】:

我选择了一种不同的解决方案,它不像我想象的那么难看。 JSObject.call() java 方法将所有回调函数参数转换为普通的 jane 对象。所以不要通过:

function(){alert("blah")}

我现在通过了:

alert("blah")

或者在一些恼人的转义之后:

''alert(\''blah\'');''

没那么可怕吧?非常感谢所有提供帮助的人,非常感谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多