如何将字符串转换为JavaScript函数调用?[重复]

2020/10/08 23:01 · javascript ·  · 0评论

我有一个像这样的字符串:

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

我想翻译成这样的函数调用:

clickedOnItem(IdofParent);

当然,这必须使用JavaScript来完成。当我settings.functionName + '(' + t.parentNode.id + ')';对它发出警报时,似乎一切都正确了。我只需要调用它将转换为的函数即可。

传说:

settings.functionName = clickedOnItem

t.parentNode.id = IdofParent

看到我讨厌eval,我并不孤单

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

编辑:回复@Mahan的评论:在这种情况下,settings.functionName将是"clickedOnItem"这将在运行时转换var fn = window[settings.functionName];var fn = window["clickedOnItem"],从而获得对的引用function clickedOnItem (nodeId) {}一旦我们引用了变量内的函数,就可以通过“调用变量”来调用该函数,即fn(t.parentNode.id),等于clickedOnItem(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);
}
window[settings.functionName](t.parentNode.id);

不需要eval()

这是在支持范围的同时更通用的方法:

// 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]];
}

希望它可以帮助一些人。

JavaScript具有eval评估字符串并将其作为代码执行函数:

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

eval()是您需要执行的功能,但是我建议尝试使用其中一种方法来最大程度地减少eval的使用。希望其中之一对您有意义。

存储功能

将函数存储为函数,而不是字符串,以后再将其用作函数。函数的实际存储位置由您决定。

var funcForLater = clickedOnItem;

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

要么

someObject.funcForLater = clickedOnItem;    
// later is now    
(someObject.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或此方法。

如果settings.functionName已经是一个函数,则可以执行以下操作:

settings.functionName(t.parentNode.id);

否则,如果settings.functionName仅仅是函数名,这也应该起作用:

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

我希望能够将函数名称作为字符串,调用它,并将参数传递给该函数。我无法为此问题选择答案,但是这个答案恰恰说明了这一点,这是一个简短的演示。

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

functionName = 'test_function';

window[functionName]('works!');

这也适用于多个参数。

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

function someFunctionName() {}

window.someFunctionName = function() {}

从那里我可以window['someFunctionName']()轻松打电话我希望这可以帮助别人!

我更喜欢使用这样的东西:

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

根据Nicolas Gauthier的答案:

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);

在使用CommonJS规范的javascript中,例如node.js,您可以执行下面显示的操作。这对于通过字符串访问变量非常方便,即使该变量未在window对象上定义也是如此如果存在一个名为的类MyClass则该类在名为MyClass.js的CommonJS模块中定义

// 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如此令人高兴的另一个原因。

eval("javascript code");

在处理JSON时被广泛使用

本文地址:http://javascript.askforanswer.com/ruhejiangzifuchuanzhuanhuanweijavascripthanshudiaoyongzhongfu.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!