【问题标题】:jquery: use string as function (error: string is not a function) [duplicate]jquery:使用字符串作为函数(错误:字符串不是函数)[重复]
【发布时间】:2013-04-12 13:29:32
【问题描述】:

下面的代码为单行数组中的每个给定 ID 生成点击函数,使用未注释的代码,我得到错误“字符串不是函数”。如果我取消注释注释的代码,并注释单行数组,它确实工作得很好。但是,出于显而易见的原因,我更喜欢使用单线阵列的方法。

谁能给我一些好的建议?我走对了吗?

提前致谢。

// callme
function callme() {
    alert("call me");
    return true;
}

// create javascript object
//var adapter = {};
// set values - key contains: ID associated with link, button or tab - value contains:   the function to call
//adapter['callme'] = callme;
//adapter['callme1'] = callme1;
//adapter['callme2'] = callme2;
//adapter['callme3'] = callme3;

var adapter = ["callme", "callme1", "callme2", "callme3"];

// foreach the object - key as ID - value as associated function
$.each(adapter, function(index, value) {
    // click on listed ID
  $("#"+ value).click(function() {
    // call associated function
        value();    
    });
    // end foreach
});

【问题讨论】:

标签: javascript jquery arrays string each


【解决方案1】:

这有点取决于范围,但一般的想法是您可以使用方括号表示法来获取对函数的引用并执行它。例如:

window[value]();

假设 callme 函数是全局范围的(window 对象的属性),则在第一次迭代中将等效于 callme()

【讨论】:

  • 谢谢,我已经试过了,我得到了错误“Uncaught TypeError: Property 'callme' of object [object global] is not a function” - 所以 callme 函数可能不是全局范围的.我该怎么做?
  • @MaartenHartman 我需要查看更多代码以确定正确的范围,或者您可以将其移到任何闭包之外(所以就在 <script></script> 标签内)所以它全局范围的。
  • 上面显示的代码就是全部了(除了$(document).ready(function($) {)。没有
【解决方案2】:

您可以尝试使用eval 将字符串评估为函数,尽管您必须小心安全。评估来自用户输入或表单提交的字符串可能会使您的网站容易受到cross-site scriptingsession hijacking 的攻击。

例子:

eval(value + "();"); //call "value" as a function

【讨论】:

  • 谢谢,我也发现了这个建议,但几乎每个人都说:不要使用 eval!我试过了,确实效果很好。但我更喜欢更安全的解决方案。
  • 只要你确定你没有解析用户输入,它是安全的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多