首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果方法名为字符串,如何调用方法

如果方法名为字符串,如何调用方法
EN

Stack Overflow用户
提问于 2018-03-12 14:43:44
回答 2查看 65关注 0票数 1

我的要求是在相变上,我必须构造方法名称,并调用方法和后续方法,在这里我可以构造方法名称,但它是字符串,不能调用方法。我遵循了一些给出的建议,但我无法实现。请帮帮忙。

代码语言:javascript
复制
var previousPhase = $("#currentPhase").val();
var projectPhaseArray = ["requirement", "design", "construction", "testing", "release"];

var i = 0;
$("#currentPhase").change(function() {
    alert(previousPhase);
    i=projectPhaseArray.indexOf(previousPhase);
    for (i; i < projectPhaseArray.length; i++) {
        alert(projectPhaseArray[i]);
        var phaseTimeLineToCall = 
        projectPhaseArray[i].concat("PhasePhaseTimeLines");
        executeFunctionByName(phaseTimeLineToCall,window);
    }
});

function executeFunctionByName(functionName, context /*, args */) {
    return context[functionName].apply(context);
}

function requirementPhaseTimeLines(){
    alert("In RequirementPhaseTimelines");
}

function designPhaseTimeLines(){
    alert("In DesignPhaseTimelines");
}

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-03-12 14:47:03

字符串不会改变,因此需要将该值保存回去

代码语言:javascript
复制
projectPhaseArray[i] = projectPhaseArray[i].concat("PhasePhaseTimeLines");
票数 0
EN

Stack Overflow用户

发布于 2018-03-12 15:05:39

您可以使用javascript对象,其中将函数名存储为key,将函数引用存储为value

代码语言:javascript
复制
var lookup = {
    requirementPhaseTimeLines: requirementPhaseTimeLines,
    designPhaseTimeLines: designPhaseTimeLines
}

不带参数

我们必须稍微修改一下executeFunctionByName

代码语言:javascript
复制
function executeFunctionByName(functionName, lookup) {
    return lookup[functionName]()
}

工作示例

代码语言:javascript
复制
function requirementPhaseTimeLines() {
    return "In RequirementPhaseTimelines"
}

function designPhaseTimeLines() {
    return "In DesignPhaseTimelines"
}

var lookup = {
    requirementPhaseTimeLines: requirementPhaseTimeLines,
    designPhaseTimeLines: designPhaseTimeLines
}

function executeFunctionByName(functionName, lookup) {
    return lookup[functionName]()
}

console.log(
    executeFunctionByName("requirementPhaseTimeLines", functions)
)

console.log(
    executeFunctionByName("designPhaseTimeLines", functions)
)

带参数

如果我们想要传递参数,我们必须对我们想要执行的函数执行curry

代码语言:javascript
复制
function greet(word) {
  return function(name) {
    return word + ', ' + name + '.'
  }
}

其次,我们必须创建一个函数,在这个函数中我们可以遍历参数,并将每个参数值设置为我们想要执行的函数:

代码语言:javascript
复制
function setArguments(functionRef, args) {
    return args.length === 1
      ? functionRef
      : setArguments(functionRef(args[0]), args.slice(1))
}

工作示例

代码语言:javascript
复制
function greet(word) {
  return function(name) {
    return word + ', ' + name + '.'
  }
}

var lookup = {
  greet: greet
}

function getFunction(lookup, name) {
  return lookup[name] || new Function()
}

function setArguments(functionRef, args) {
  return args.length === 1
    ? functionRef
    : setArguments(functionRef(args[0]), args.slice(1))
}

function executeFunctionByName(functionName, lookup, args) {
  var functionRef = getFunction(lookup, functionName)
  var functionRefWithArgs = setArguments(functionRef, args)
  return functionRefWithArgs(args[args.length - 1])
}

console.log(
  executeFunctionByName('greet', lookup, ['Hi', 'Jon'])
)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49229448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档