我有一个动态的功能块,我需要使用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
答案 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
;根据需要进行调整。
在这些限制条件中,e
和eval
确实是您唯一的选择。它并不比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);
}