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']()
. 이렇게 무한정 연결할 수 있습니다.