Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将字符串转换为JavaScript函数调用?_Javascript_Function - Fatal编程技术网

如何将字符串转换为JavaScript函数调用?

如何将字符串转换为JavaScript函数调用?,javascript,function,Javascript,Function,我得到了一个字符串,比如: settings.functionName + '(' + t.parentNode.id + ')'; 我想转换成函数调用,如下所示: clickedOnItem(IdofParent); 当然,这必须在JavaScript中完成。当我在settings.functionName+'('+t.parentNode.id+')上执行警报时似乎一切都正确。我只需要调用它将转换成的函数 图例: settings.functionName = clickedOnItem

我得到了一个字符串,比如:

settings.functionName + '(' + t.parentNode.id + ')';
我想转换成函数调用,如下所示:

clickedOnItem(IdofParent);
当然,这必须在JavaScript中完成。当我在
settings.functionName+'('+t.parentNode.id+')上执行警报时似乎一切都正确。我只需要调用它将转换成的函数

图例:

settings.functionName = clickedOnItem

t.parentNode.id = IdofParent
JavaScript有一个计算字符串并将其作为代码执行的函数:

eval(settings.functionName + '(' + t.parentNode.id + ')');

它在处理设置时广泛使用。

如果
设置。functionName
已经是一个函数,您可以执行以下操作:

settings.functionName(t.parentNode.id);
否则,如果
设置也可以使用。functionName
只是函数的名称:

if (typeof window[settings.functionName] == "function") {
    window[settings.functionName](t.parentNode.id);
}

不需要评估()

因为我讨厌评估,我是:

编辑:回复@Mahan的评论: 在这种特殊情况下,
设置。functionName
将是
“clickedOnItem”
。这将在运行时转换
var fn=window[settings.functionName]
进入
var fn=window[“clickedOnItem”]
,这将获得对
函数clickedOnItem(nodeId){}
的引用。一旦我们有了对变量内部函数的引用,我们就可以通过“调用变量”来调用此函数,即
fn(t.parentNode.id)
,它等于
clickednitem(t.parentNode.id)
,这正是OP想要的

更完整的示例:

/* Somewhere: */
window.settings = {
  /* [..] Other settings */
  functionName: 'clickedOnItem'
  /* , [..] More settings */
};

/* Later */
function clickedOnItem (nodeId) {
  /* Some cool event handling code here */
}

/* Even later */
var fn = window[settings.functionName]; 
/* note that settings.functionName could also be written
   as window.settings.functionName. In this case, we use the fact that window
   is the implied scope of global variables. */
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}
eval()是实现这一点所需的函数,但我建议尝试以下方法之一,以尽量减少eval的使用。希望其中一个对你有意义

存储该功能

将函数存储为函数,而不是字符串,然后将其用作函数。实际存储函数的位置取决于您

var funcForLater = clickedOnItem;

// later is now
funcForLater(t.parentNode.id);

存储函数名

即使必须将函数名存储为字符串,也可以通过

(eval(settings.functionName))(t.parentNode.id);
这样可以最大限度地减少您必须构造和评估的Javascript数量

处理程序字典

将您可能需要的所有操作函数放入一个对象中,并使用字符串将它们称为字典样式

// global
itemActions = { click: clickedOnItem, rightClick: rightClickedOnItem /* etc */ };

// Later...
var actionName = "click"; // Or wherever you got the action name
var actionToDo = itemActions[actionName];
actionToDo(t.parentNode.id);

(小提示:如果您在这里使用语法
itemActions[actionName](t.parentNode.id);
则该函数将作为
itemActions
的方法调用)

虽然我喜欢第一个答案,但我讨厌eval,但我想补充一点,还有另一种方法(类似于eval),因此如果您可以绕过它而不使用它,那么您最好这样做。但在某些情况下,您可能希望在某个ajax调用之前或之后调用某些javascript代码,如果您在自定义属性中使用此代码而不是ajax,则可以使用以下代码:

    var executeBefore = $(el).attr("data-execute-before-ajax");
    if (executeBefore != "") {
        var fn = new Function(executeBefore);
        fn();
    }
或者,如果可能需要多次调用,则最终将其存储在函数缓存中


再次-如果有其他方法,请不要使用eval或此方法。

我花了一段时间才弄明白,因为传统的
窗口['someFunctionName']()
一开始对我不起作用。我的函数名作为AJAX响应从数据库中提取。此外,无论出于何种原因,我的函数声明在窗口范围之外,因此为了解决这个问题,我必须重写从中调用的函数

function someFunctionName() {}


从那里我可以轻松地调用
window['someFunctionName']()
。我希望这对别人有帮助

我更喜欢这样使用:

window.callbackClass['newFunctionName'] = function(data) { console.log(data) };
...
window.callbackClass['newFunctionName'](data);

在使用CommonJS规范的javascript中,例如node.js,您可以执行下面的操作。这对于通过字符串访问变量非常方便,即使它未在
窗口
对象上定义。如果在名为MyClass.js的CommonJS模块中定义了名为MyClass的类

// MyClass.js
var MyClass = function() {
    // I do stuff in here. Probably return an object
    return {
       foo: "bar"
    }
}

module.exports = MyClass;
然后,您可以从另一个名为MyOtherFile.js的文件中执行这一出色的巫术

// MyOtherFile.js

var myString = "MyClass";

var MyClass = require('./' + myString);
var obj = new MyClass();

console.log(obj.foo); // returns "bar"

CommonJS如此令人愉快的另一个原因是。

这里有一种更通用的方法,可以在支持作用域的同时做到这一点:

// Get function from string, with or without scopes (by Nicolas Gauthier)
window.getFunctionFromString = function(string)
{
    var scope = window;
    var scopeSplit = string.split('.');
    for (i = 0; i < scopeSplit.length - 1; i++)
    {
        scope = scope[scopeSplit[i]];

        if (scope == undefined) return;
    }

    return scope[scopeSplit[scopeSplit.length - 1]];
}
//从字符串获取函数,带或不带作用域(Nicolas Gauthier)
window.getFunctionFromString=函数(字符串)
{
var范围=窗口;
var scopeSplit=string.split('.');
对于(i=0;i

希望它能帮助一些人。

基于尼古拉斯·高蒂尔的回答:

var strng = 'someobj.someCallback';
var data = 'someData';

var func = window;
var funcSplit = strng.split('.');
for(i = 0;i < funcSplit.length;i++){
   //We maybe can check typeof and break the bucle if typeof != function
   func = func[funcSplit[i]];
}
func(data);
var strng='someobj.someCallback';
var数据='someData';
var func=窗口;
var funcSplit=strng.split('.');
对于(i=0;i
我希望能够将函数名作为字符串,调用它,并将参数传递给函数。我无法得到这个问题的选定答案,但这正好说明了这一点,下面是一个简短的演示

function test_function(argument)    {
    alert('This function ' + argument); 
}

functionName = 'test_function';

window[functionName]('works!');

这也适用于多个参数。

什么类型是
settings.functionName
?很好。当然,这是假设函数没有在不同的范围内声明,但即使这样,我也可以想象您可以在该范围内执行此操作…如果所需函数在全局范围内,则它可以工作,如果不在全局范围内,则用函数的范围替换窗口。工作正常。甚至比eval函数调用使用更少的代码。很高兴看到另一个家伙尽可能避免eval。但在闭包代码中不起作用<代码>(函数(){})()我可以投票反对在适当的情况下使用eval。这里不需要评估。最好将函数作为对象的属性来查找。Eval很慢,有点像用大锤打苍蝇。看看机器的回答。Eval是一个常见的习语。如果你不喜欢它,你可能会讨厌Javascript。伊姆霍,这里的正确答案是eval。如果删除if typedef检查,机器的答案是可以的,但它会无缘无故添加代码。如果有
// MyClass.js
var MyClass = function() {
    // I do stuff in here. Probably return an object
    return {
       foo: "bar"
    }
}

module.exports = MyClass;
// MyOtherFile.js

var myString = "MyClass";

var MyClass = require('./' + myString);
var obj = new MyClass();

console.log(obj.foo); // returns "bar"
// Get function from string, with or without scopes (by Nicolas Gauthier)
window.getFunctionFromString = function(string)
{
    var scope = window;
    var scopeSplit = string.split('.');
    for (i = 0; i < scopeSplit.length - 1; i++)
    {
        scope = scope[scopeSplit[i]];

        if (scope == undefined) return;
    }

    return scope[scopeSplit[scopeSplit.length - 1]];
}
var strng = 'someobj.someCallback';
var data = 'someData';

var func = window;
var funcSplit = strng.split('.');
for(i = 0;i < funcSplit.length;i++){
   //We maybe can check typeof and break the bucle if typeof != function
   func = func[funcSplit[i]];
}
func(data);
function test_function(argument)    {
    alert('This function ' + argument); 
}

functionName = 'test_function';

window[functionName]('works!');