[javascript] 이름이 문자열 일 때 JavaScript 함수를 실행하는 방법

JavaScript에서 함수 이름을 문자열로 가지고 있습니다. 나중에 호출 할 수 있도록 함수 포인터로 어떻게 변환합니까?

상황에 따라 다양한 인수를 메소드에 전달해야 할 수도 있습니다.

일부 기능은의 형태를 취할 수 있습니다 namespace.namespace.function(args[...]).



답변

절대적으로 다른 선택의 여지가 없다면 절대 사용 eval하지 마십시오 .

앞에서 언급했듯이 이와 같은 것을 사용하는 것이 가장 좋은 방법입니다.

window["functionName"](arguments);

그러나 네임 스페이스의 함수에서는 작동하지 않습니다.

window["My.Namespace.functionName"](arguments); // fail

이것이 당신이하는 방법입니다 :

window["My"]["Namespace"]["functionName"](arguments); // succeeds

보다 쉽게 ​​만들고 유연성을 제공하기 위해 다음과 같은 편리한 기능이 있습니다.

function executeFunctionByName(functionName, context /*, args */) {
  var args = Array.prototype.slice.call(arguments, 2);
  var namespaces = functionName.split(".");
  var func = namespaces.pop();
  for(var i = 0; i < namespaces.length; i++) {
    context = context[namespaces[i]];
  }
  return context[func].apply(context, args);
}

다음과 같이 호출합니다.

executeFunctionByName("My.Namespace.functionName", window, arguments);

원하는 컨텍스트를 전달할 수 있으므로 위와 동일하게 수행됩니다.

executeFunctionByName("Namespace.functionName", My, arguments);


답변

Jason Bunting의 매우 유용한 기능의 약간 변경된 버전을 게시한다고 생각했습니다 .

먼저 slice ()에 두 번째 매개 변수를 제공하여 첫 번째 문을 단순화했습니다 . 원래 버전은 IE를 제외한 모든 브라우저에서 제대로 작동했습니다.

둘째, 나는 대체 한 컨텍스트 return 문에서; 그렇지 않으면, 가리키는 언제나 대상 기능이 실행되는 때.

function executeFunctionByName(functionName, context /*, args */) {
    var args = Array.prototype.slice.call(arguments, 2);
    var namespaces = functionName.split(".");
    var func = namespaces.pop();
    for (var i = 0; i < namespaces.length; i++) {
        context = context[namespaces[i]];
    }
    return context[func].apply(context, args);
}


답변

이 다른 질문에 대한 대답은 그 방법을 보여줍니다 : Python의 locals ()에 해당하는 Javascript?

기본적으로 말할 수 있습니다

window["foo"](arg1, arg2);

또는 다른 많은 사람들이 제안했듯이 eval을 사용할 수 있습니다.

eval(fname)(arg1, arg2);

평가하고있는 내용에 대해 확실하지 않으면 매우 안전하지 않습니다.


답변

당신은 이것을 할 수 없습니까?

var codeToExecute = "My.Namespace.functionName()";
var tmpFunc = new Function(codeToExecute);
tmpFunc();

이 방법을 사용하여 다른 JavaScript를 실행할 수도 있습니다.


답변

이 작업을 수행하는 우아한 방법은 해시 개체에서 함수를 정의하는 것입니다. 그런 다음 문자열을 사용하여 해시에서 해당 함수에 대한 참조를 가질 수 있습니다. 예 :

var customObject = {
  customFunction: function(param){...}
};

그런 다음 전화를 걸 수 있습니다.

customObject['customFunction'](param);

여기서 customFunction은 객체에 정의 된 함수와 일치하는 문자열입니다.


답변

ES6을 사용하면 이름으로 클래스 메소드에 액세스 할 수 있습니다.

class X {
  method1(){
    console.log("1");
  }
  method2(){
    this['method1']();
    console.log("2");
  }
}
let x  = new X();
x['method2']();

결과는 다음과 같습니다.

1
2


답변

두가지:

  • 평가를 피하십시오, 그것은 매우 위험하고 느립니다

  • 두 번째로 함수의 존재 여부는 중요하지 않습니다. “글로벌”-ness는 관련이 없습니다. x.y.foo()를 통해 사용할 수 있습니다 x.y['foo']()또는 x['y']['foo']()심지어 window['x']['y']['foo'](). 이렇게 무한정 연결할 수 있습니다.