Javascript,传递' e'到新功能,范围

时间:2015-02-17 09:35:07

标签: javascript

我有一个动态的功能块,我需要使用eval或new函数调用(最好是后者)。我希望传递它从

中提出的事件
function MyFunc(e)
{
  new Function("OtherFunc(e, 'abcde')");
}

我无法看到如何做到这一点,我尝试过一些东西,比如bind(this)和(this),但没有快乐。这是一件不寻常的事情。

注意我可以看到它适用于eval,但如果可能的话新功能会更好,我会得到它应该是的印象,例如 How to use scope in JavaScript for Function constructor?(第二个答案)

有什么建议吗?感谢

(补充:为什么我要这样做) 我正在使用Kendo移动按钮。我要离开这个:

<button onclick="MyFunc(e)"/>

到这个

<button data-click="Call" data-func="MyFunc(e)"/>

这是因为不建议在iPhone上使用Kendo UI进行onclick

2 个答案:

答案 0 :(得分:2)

不要使用函数构造函数。真的,真的没有。它是eval的另一个名字。请改用函数声明。这不会打破范围或期望用字符串构建。

function MyTest(e) {
  function callOtherFunc() {
      OtherFunc(e, "abcde");
  }

  return callOtherFunc;
}

答案 1 :(得分:1)

所以基本上,你现在有按钮

onclick="MyFunc(e); OtherFunc('a')"

...你想把它们改成

data-click="Call" data-func="MyFunc(e); OtherFunc('a')"

...而且您正在尝试弄清楚如何编写Call函数而不用任何重要的重构,继续使用现在在{{{ 1}}。

我对你在onclick而不是e中使用onclick感到困惑。据我所知,event处理程序的范围没有e;但是,该事件可以onXyz获得。在下面的答案中,我假设event中有event,但其他地方都有onclick;根据需要进行调整。

在这些限制条件中,eeval确实是您唯一的选择。它并不比new Function(伪装成onclick更邪恶);与你控制的字符串一起使用的eval不一定是邪恶的,它通常只是最后的手段(有点像eval)。

基于the documentation,看起来您的with看起来像这样:

Call

最终运行代码时function Call(e) { var code = this.element.prop("data-func"); var f = new Function("e", code); f.call(this, e); } 是被点击的元素,并且this的范围是生成函数中的代码。

不推荐这个,除非在正确的重构过程中作为临时措施,但在你给出的限制内,这就是我看到它的工作方式。我不推荐它的一个原因是,与e一样,所有函数都必须是全局变量(因为除了传递它的args之外,onclick只能访问全局变量),并且像瘟疫一样最好避免使用全局数据。

实例(有一些解决方法,因为我没有包括剑道):

new Function
// Kendo calls the data-click function with this being something
// other than the element; but the element is available as `this.element`
function fakeKendo(e) {
  Call.call({element: this}, e);
}

function Call(e) {
  // (Using getAttribute instead of Kendo's prop here)
  var code = this.element.getAttribute("data-func");
  var f = new Function("e", code);
  f.call(this, e);
}

function MyFunc(e) {
  snippet.log("MyFunc: e.type = " + e.type);
}

function OtherFunc(arg) {
  snippet.log("OtherFunc: arg is " + arg);
}