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


1050

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

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

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

답변:


1438

절대적으로 다른 선택의 여지가 없다면 절대 사용 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);

4
당신은 전체 "func"구문이 필요하지 않다는 것을 알고 있습니까? "context.apply"만으로도 괜찮습니다
— annakata

16
물론, 나는 알고 있습니다. 그러나 함수를 작성하는 방식은 그것을 읽고있는 사람들에게 어떤 일이 일어나고 있는지 완전히 파악하지 못할 수있는 명확성을 제공합니다. 나는 사람들이 그것을 읽는 데 도움이 필요하다는 것을 깨닫는이 기능을 썼습니다. 당신이 요청했기 때문에 나는 대안을 제공 할 것입니다 ...
— Jason Bunting

108
스크래치-코드가 명확하고 알고있는 사람들이 알고 있습니다. 당신이 나와 같은데 당신이하고있는 일을 알고 있다면,이 코드를 사용한다면 스스로 변경할 수 있습니다. 스택 오버플로는 다른 사람들을 교육하기위한 것이며 초보자가 이해하기 쉬운 코드라고 생각합니다. 그래도 고마워!
— Jason Bunting

4
window [ "funcName"]이 정의되지 않은 상황이 발생합니까? 그것이 내가 지금 겪고있는 문제입니다. 호출 코드와 함수는 두 개의 개별 js 파일에 정의되어 있습니다. 나는 그것들을 같은 파일에 추가하려고 시도했지만 아무런 차이가 없었습니다.
— codemonkey

5
여기에 문제가 있다고 생각합니다. 당신이 호출 할 때 My.Namespace.functionName(), this받는 참조 할 My.Namespace객체입니다. 그러나을 호출 하면 같은 것을 참조 할 executeFunctionByName("My.Namespace.functionName", window)방법이 없습니다 this. 아마도 마지막 네임 스페이스를 범위로 사용하거나 window네임 스페이스가없는 경우를 사용해야합니다. 또는 사용자가 범위를 인수로 지정할 수 있습니다.
— JW.

100

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

"functionName"이 실제로 존재하는지 확인하지 않습니까?
— Crashalot

맥의 답변이 과소 평가 된 것 같습니다. 나는 전문가는 아니지만 잘 생각하고 강력 해 보입니다.
— Martin Hansen Lennox

65

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

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

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

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

eval(fname)(arg1, arg2);

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


6
첫 번째 형태가 훨씬 바람직하다
— annakata

19
다른 모든 방법이 실패한 경우 eval을 최후의 수단으로 만 사용하십시오.
— Jason Bunting

1
그것은 ...하지만 xyz (args)와 같은 기능으로 작동합니까?
— Kieron

@keiron : 그렇습니다. 아래 내 답변을 참조하십시오
— annakata

55

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

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

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


3
심지어 인자가 함수와 함께 전달 될 때 작동
— adeel41

함수 반환은 어떻습니까?
— 피터 데 네프

12
그것과 어떻게 eval("My.Namespace.functionName()");다릅니 까?
— developerbmw

@PeterDenev는 첫 번째 줄을var codeToExecute = "return My.Namespace.functionName()";
— developerbmw로

2
@developerbmw, 여기에 답변 stackoverflow.com/questions/4599857/…
— Tejasvi Hegde

48

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

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

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

customObject['customFunction'](param);

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


@ibsenv,이 답변을 가장 잘 식별 할 수 있도록 귀하의 의견에 감사드립니다. 나는 함수 객체의 배열을 만들고 그것을 deferred.promises의 배열을 만드는 데 사용했습니다. 아래에 샘플 코드를 넣습니다. (새 답글을 작성하고 Ruben의 응답을 빌리고 싶지 않았습니다 .)
— user216661 2016 년

function getMyData (arrayOfObjectsWithIds) {var functionArray = arrayOfObjectsWithIds.map (function (value) {return {myGetDataFunction : MyService.getMyData (value.id)};}) var promises = functionArray.map (function (getDataFunction) {var deferred = $ q.defer (); getDataFunction.myGetDataFunction.success (function (data) {deferred.resolve (data)}) error (function (error) {deferred.reject ();}); deferred.promise;}); $ q.all (promises) .then (function (dataArray) {// do stuff})};
— user216661

이것은 기능이 우수한지 확인하기 위해 밑줄 / 대쉬 만 추가하는 것이 좋습니다. 그리고 다음을 실행
— elporfirio

35

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

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

결과는 다음과 같습니다.

1
2

1
최고의 자바 스크립트 PURE ... 하나님 .. 수업이 작동하지 않고 괜찮습니다. 감사!
— KingRider

1
이것은 내가 오랫동안 찾고 있던 것입니다. 감사!
— PaladiN

ES2015는 여기서 할 일이 없습니다. 순수 객체를 사용하거나을 통해 프로토 타입 위임을 사용하여 동일한 목표를 달성 할 수 있습니다 Object.create(). const myObj = {method1 () {console.log ( '1')}, method2 () {console.log ( '2')}} myObj [ 'method1'] (); // 1 myObj [ 'method2'] (); // 2
— sminutoli

1
이것은 금입니다 !!! 나는 이것을 전에 생각한 적이 없다는 것에 놀랐습니다. 좋은!!!
— thxmike

또한 이것이 우리의 목표를 달성하기위한 가장 적은 방법이라고 생각합니다.
— Chris Jung

24

두가지:

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

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


1
하지만 당신은 창을 할 수 없어 [ 'XYZ'] () XYZ를 (호출하는)
— nickf

17

모든 답변은 전역 범위 (창)를 통해 기능에 액세스 할 수 있다고 가정합니다. 그러나 OP는 이러한 가정을하지 않았습니다.

함수가 로컬 범위 (일명 폐쇄)에 있고 다른 로컬 객체에 의해 참조되지 않으면 운이 없습니다 : eval()AFAIK 를 사용해야합니다 .JavaScript에서 동적으로 로컬 함수 호출을 참조하십시오


2
야 (또는 야유), 지적 해 주셔서 대단히 감사합니다! 나는 내가 잠시 미쳐 가고 있다고 생각했다.
— Funktr0n

13

로 문자열을 포인터로 변환하면됩니다 window[<method name>]. 예:

var function_name = "string";
function_name = window[function_name];

이제 포인터처럼 사용할 수 있습니다.


이것은 훨씬 안전한 방법 인 것 같습니다.
— James Poulose

12

다음은 Jason Bunting 's / Alex Nazarov의 탁월한 답변에 대한 공헌입니다. 여기에는 Crashalot에서 요청한 오류 검사가 포함됩니다.

이 (고려 된) 서문이 주어지면 :

a = function( args ) {
    console.log( 'global func passed:' );
    for( var i = 0; i < arguments.length; i++ ) {
        console.log( '-> ' + arguments[ i ] );
    }
};
ns = {};
ns.a = function( args ) {
    console.log( 'namespace func passed:' );
    for( var i = 0; i < arguments.length; i++ ) {
        console.log( '-> ' + arguments[ i ] ); 
    }
};
name = 'nsa';
n_s_a = [ 'Snowden' ];
noSuchAgency = function(){};

다음 기능 :

function executeFunctionByName( functionName, context /*, args */ ) {
    var args, namespaces, func;

    if( typeof functionName === 'undefined' ) { throw 'function name not specified'; }

    if( typeof eval( functionName ) !== 'function' ) { throw functionName + ' is not a function'; }

    if( typeof context !== 'undefined' ) { 
        if( typeof context === 'object' && context instanceof Array === false ) { 
            if( typeof context[ functionName ] !== 'function' ) {
                throw context + '.' + functionName + ' is not a function';
            }
            args = Array.prototype.slice.call( arguments, 2 );

        } else {
            args = Array.prototype.slice.call( arguments, 1 );
            context = window;
        }

    } else {
        context = window;
    }

    namespaces = functionName.split( "." );
    func = namespaces.pop();

    for( var i = 0; i < namespaces.length; i++ ) {
        context = context[ namespaces[ i ] ];
    }

    return context[ func ].apply( context, args );
}

인수 (배열 객체 포함)를 포함하거나 포함하지 않고 네임 스페이스 또는 전역으로 문자열에 저장된 이름으로 자바 스크립트 함수를 호출하여 발생한 오류에 대한 피드백을 제공 할 수 있습니다.

샘플 출력은 작동 방식을 보여줍니다.

// calling a global function without parms
executeFunctionByName( 'a' );
  /* OUTPUT:
  global func passed:
  */

// calling a global function passing a number (with implicit window context)
executeFunctionByName( 'a', 123 );
  /* OUTPUT:
  global func passed:
  -> 123
  */

// calling a namespaced function without parms
executeFunctionByName( 'ns.a' );
  /* OUTPUT:
  namespace func passed:
  */

// calling a namespaced function passing a string literal
executeFunctionByName( 'ns.a', 'No Such Agency!' );
  /* OUTPUT:
  namespace func passed:
  -> No Such Agency!
  */

// calling a namespaced function, with explicit context as separate arg, passing a string literal and array 
executeFunctionByName( 'a', ns, 'No Such Agency!', [ 007, 'is the man' ] );
  /* OUTPUT:
  namespace func passed:
  -> No Such Agency!
  -> 7,is the man
  */

// calling a global function passing a string variable (with implicit window context)
executeFunctionByName( 'a', name );
  /* OUTPUT:
  global func passed:
  -> nsa
  */

// calling a non-existing function via string literal
executeFunctionByName( 'n_s_a' );
  /* OUTPUT:
  Uncaught n_s_a is not a function
  */

// calling a non-existing function by string variable
executeFunctionByName( n_s_a );
  /* OUTPUT:
  Uncaught Snowden is not a function
  */

// calling an existing function with the wrong namespace reference
executeFunctionByName( 'a', {} );
  /* OUTPUT:
  Uncaught [object Object].a is not a function
  */

// calling no function
executeFunctionByName();
  /* OUTPUT:
  Uncaught function name not specified
  */

// calling by empty string
executeFunctionByName( '' );
  /* OUTPUT:
  Uncaught  is not a function
  */

// calling an existing global function with a namespace reference
executeFunctionByName( 'noSuchAgency', ns );
  /* OUTPUT:
  Uncaught [object Object].noSuchAgency is not a function
  */

던노 ... 매우 좋은 노력입니다. 그러나 "너무 광범위"나에게 같은 소리 ...
— TechNyquist

2
응? SO는 질문 / 응답 / 교육 플랫폼입니다. 조명을 희망적으로 전달하기 위해 생각할 수있는 모든 예제를 기꺼이 제공하겠습니다. 나에게 그게 요점 입니다.
— Mac

어쨌든 functionName을 평가하는 경우 왜 사용하지 않습니까?
— 데이터

이것은 나를 위해 작동하지 않습니다. 네임 스페이스 함수 abcd가 있는데 여기서 d는 함수 이름입니다. context-window- if( typeof context[ functionName ] !== 'function' )가 정의되어 있고 객체 및 배열이기 때문에 executeFunctionByName ( "abcd", window) 호출이 온라인에서 실패 하지만 허용 된 문제에서 식별 된대로 window [ 'abcd']가 존재하지 않습니다. 답변 : window["My.Namespace.functionName"](arguments); // fail
— akousmata

12

당신이 어디에 있는지에 따라 당신은 또한 사용할 수 있습니다 :

this["funcname"]();
self["funcname"]();
window["funcname"]();
top["funcname"]();
globalThis["funcname"]();

또는 nodejs에서

global["funcname"]()

9

로 전역 함수 대신 객체의 함수를 호출하려는 경우 window["functionName"]. 당신은 그것을 좋아할 수 있습니다;

var myObject=new Object();
myObject["functionName"](arguments);

예:

var now=new Date();
now["getFullYear"]()

8

조심해!!!

다음 두 가지 이유로 JavaScript에서 문자열로 함수를 호출하지 않도록해야합니다.

이유 1 : 일부 코드 난독 화기는 함수 이름을 변경하여 문자열을 무효화하여 코드를 손상시킵니다.

이유 2 : 문자열에 의해 호출 된 메소드의 사용법을 찾기가 더 어렵 기 때문에이 방법을 사용하는 코드를 유지하기가 훨씬 어렵습니다.


7

다음은 Es6 접근 방식으로 이름이나 문자열로 함수 이름을 호출하고 다른 유형의 함수에 다른 수의 인수를 전달할 수 있습니다.

function fnCall(fn, ...args)
{
  let func = (typeof fn =="string")?window[fn]:fn;
  if (typeof func == "function") func(...args);
  else throw new Error(`${fn} is Not a function!`);
}


function example1(arg1){console.log(arg1)}
function example2(arg1, arg2){console.log(arg1 + "  and   " + arg2)}
function example3(){console.log("No arguments!")}

fnCall("example1", "test_1");
fnCall("example2", "test_2", "test3");
fnCall(example3);
fnCall("example4"); // should raise an error in console


6

setTimeout에 대한 언급이없는 것에 놀랐습니다.

인수없이 함수를 실행하려면

var functionWithoutArguments = function(){
    console.log("Executing functionWithoutArguments");
}
setTimeout("functionWithoutArguments()", 0);

인수로 함수를 실행하려면 다음을 수행하십시오.

var functionWithArguments = function(arg1, arg2) {
    console.log("Executing functionWithArguments", arg1, arg2);
}
setTimeout("functionWithArguments(10, 20)");

네임 스페이스가 깊은 기능을 실행하려면

var _very = {
    _deeply: {
        _defined: {
            _function: function(num1, num2) {
                console.log("Execution _very _deeply _defined _function : ", num1, num2);
            }
        }
    }
}
setTimeout("_very._deeply._defined._function(40,50)", 0);

이것은 질문에 대한 답변을 제공하지 않습니다. 작성자의 의견을 비판하거나 설명을 요청하려면 게시물 아래에 댓글을 남겨주세요. 언제든지 자신의 게시물 에 댓글 을 달 수 있으며 평판 이 충분 하면 게시물 에 댓글 을 달 수 있습니다 .
— AstroCB

runMe몇 가지 인수를 사용하여 호출하는 방법에 대한 예를 추가하십시오 .
— lexicore

1
@lexicore 나는 질문에 대한 실질적인 대답을 명확하게 제공 하지 않으며 그 자체로는 가치가 거의 없기 때문에 리뷰 대기열에서 삭제 에 투표했습니다 .
— AstroCB

1
이 실행은 말하듯이 방법은 잠재적으로 큰 결함을 가지고 렌더링 끝 이 호출 따라서 대기열을 asynchronious을
— peterm는

1
이 답변이 마음에 들며 요구 사항에 맞는 것 같습니다.
— Quintonn

3

따라서 다른 사람들이 말했듯이 가장 좋은 옵션은 다음과 같습니다.

window['myfunction'](arguments)

처럼 그리고 제이슨 멧새 말했다 함수의 이름이 객체를 포함하는 경우, 그것은 작동하지 않습니다 :

window['myobject.myfunction'](arguments); // won't work
window['myobject']['myfunction'](arguments); // will work

다음은 이름으로 모든 기능을 수행하는 함수 버전입니다 (객체 포함 여부 포함).

my = {
    code : {
        is : {
            nice : function(a, b){ alert(a + "," + b); }
        }
    }
};

guy = function(){ alert('awesome'); }

function executeFunctionByName(str, args)
{
    var arr = str.split('.');
    var fn = window[ arr[0] ];
    
    for (var i = 1; i < arr.length; i++)
    { fn = fn[ arr[i] ]; }
    fn.apply(window, args);
}

executeFunctionByName('my.code.is.nice', ['arg1', 'arg2']);
executeFunctionByName('guy');


3
  let t0 = () => { alert('red0') }
  var t1 = () =>{ alert('red1') }
  var t2 = () =>{ alert('red2') }
  var t3 = () =>{ alert('red3') }
  var t4 = () =>{ alert('red4') }
  var t5 = () =>{ alert('red5') }
  var t6 = () =>{ alert('red6') }

  function getSelection(type) {
    var evalSelection = {
      'title0': t0,
      'title1': t1,
      'title2': t2,
      'title3': t3,
      'title4': t4,
      'title5': t5,
      'title6': t6,
      'default': function() {
        return 'Default';
      }
    };
    return (evalSelection[type] || evalSelection['default'])();
  }
  getSelection('title1');

더 많은 OOP 솔루션 ...


2

Jason과 Alex의 게시물에 대한 자세한 내용입니다. 컨텍스트에 기본값을 추가하는 것이 도움이된다는 것을 알았습니다. context = context == undefined? window:context;기능의 시작 부분에 넣으십시오 . window원하는 컨텍스트로 변경할 수 있으며 기본 컨텍스트에서이를 호출 할 때마다 동일한 변수를 전달할 필요가 없습니다.


2

Jason Bunting의 답변에 추가하기 위해 nodejs 또는 무언가를 사용하고 있다면 (dom js에서도 작동 함) this대신 대신 사용할 수 있습니다 window(eval is evil :

this['fun'+'ctionName']();

2

내 코드에는 매우 비슷한 것이 있습니다. 타사 라이브러리의 콜백으로 전달 해야하는 함수 이름이 포함 된 서버 생성 문자열이 있습니다. 그래서 문자열을 가져 와서 함수에 "포인터"를 반환하거나 찾지 못하면 null을 반환하는 코드가 있습니다.

내 솔루션은 " Jason Bunting의 매우 유용한 기능 " * 과 매우 유사 하지만 자동 실행되지 않으며 컨텍스트가 항상 창에 있습니다. 그러나 이것은 쉽게 수정 될 수 있습니다.

잘하면 이것은 누군가에게 도움이 될 것입니다.

/**
 * Converts a string containing a function or object method name to a function pointer.
 * @param  string   func
 * @return function
 */
function getFuncFromString(func) {
    // if already a function, return
    if (typeof func === 'function') return func;

    // if string, try to find function or method of object (of "obj.func" format)
    if (typeof func === 'string') {
        if (!func.length) return null;
        var target = window;
        var func = func.split('.');
        while (func.length) {
            var ns = func.shift();
            if (typeof target[ns] === 'undefined') return null;
            target = target[ns];
        }
        if (typeof target === 'function') return target;
    }

    // return null if could not parse
    return null;
}


1

함수 이름을 포함하는 문자열의 일부로 전달되는 알 수없는 인수가있는 경우 도움이 되는 또 다른 트릭에 대해서는 언급 할 수 없습니다 . 예를 들면 다음과 같습니다.

var annoyingstring = 'call_my_func(123, true, "blah")';

Javascript가 HTML 페이지에서 실행중인 경우 보이지 않는 링크 만 있으면됩니다. onclick속성에 문자열을 전달 하고 click메소드를 호출 할 수 있습니다 .

<a href="#" id="link_secret"><!-- invisible --></a>

$('#link_secret').attr('onclick', annoyingstring);
$('#link_secret').click();

또는 <a>런타임에 요소를 작성하십시오 .


창의적인 솔루션이지만 객체 또는 배열 유형 인수에는 작동하지 않습니다.
— Dennis Heiden

1
이것은 후드 아래에서 eval을 사용하고 있습니다 ... 그리고 실제로 부시 주위를 치고 그것을
— Juan Mendes

1

가장 쉬운 방법은 요소가있는 것처럼 액세스하는 것입니다

window.ClientSideValidations.forms.location_form

~와 같다

window.ClientSideValidations.forms['location_form']

1

eval("functionname as string")어느 쪽이든 자바 스크립트 함수를 호출 할 수 있습니다 . 아래와 같이 : (평가는 순수한 자바 스크립트 함수입니다)

function testfunc(){
    return "hello world";
}

$( document ).ready(function() {

     $("div").html(eval("testfunc"));
});

실제 예 : https://jsfiddle.net/suatatan/24ms0fna/4/


이것은 훌륭하고 간단합니다
— Carlos E

1
또한 정말 느립니다.
— Marco

1

이것은 나를 위해 일하고 있습니다 :

var command = "Add";
var tempFunction = new Function("Arg1","Arg2", "window." + command + "(Arg1,Arg2)");
tempFunction(x,y);

이것이 효과가 있기를 바랍니다.


1

복잡한 중간 함수 또는 평가가 필요하거나 window와 같은 전역 변수에 의존한다고 생각하지 않습니다.

function fun1(arg) {
  console.log(arg);
}

function fun2(arg) {
  console.log(arg);
}

const operations = {
  fun1,
  fun2
};

let temp = "fun1";

try {
  // You have to use square brackets property access
  operations["fun1"]("Hello World");
  operations["fun2"]("Hello World");
  // You can use variables
  operations[temp]("Hello World");
} catch (error) {
  console.error(error);
}

가져온 함수에서도 작동합니다.

// mode.js
export function fun1(arg) {
  console.log(arg);
}

export function fun2(arg) {
  console.log(arg);
}
// index.js
import { fun1, fun2 } from "./mod";

const operations = {
  fun1,
  fun2
};

try {
  operations["fun1"]("Hello World");
  operations["fun2"]("Hello World");
} catch (error) {
  console.error(error);
}

0

를 사용하지 않으면을 사용하여 eval('function()')새 함수를 만들 수 있습니다 new Function(strName). 아래 코드는 FF, Chrome, IE를 사용하여 테스트되었습니다.

<html>
<body>
<button onclick="test()">Try it</button>
</body>
</html>
<script type="text/javascript">

  function test() {
    try {    
        var fnName = "myFunction()";
        var fn = new Function(fnName);
        fn();
      } catch (err) {
        console.log("error:"+err.message);
      }
  }

  function myFunction() {
    console.log('Executing myFunction()');
  }

</script>

0
use this

function executeFunctionByName(functionName, context /*, args */) {
      var args = [].slice.call(arguments).splice(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);
    }

1
왜? 설명이없는 답변은 쓸모가 없습니다.
— Daniel W.

0

기본 봐 :

var namefunction = 'jspure'; // String

function jspure(msg1 = '', msg2 = '') { 
  console.log(msg1+(msg2!=''?'/'+msg2:''));
} // multiple argument

// Results ur test
window[namefunction]('hello','hello again'); // something...
eval[namefunction] = 'hello'; // use string or something, but its eval just one argument and not exist multiple

기존의 다른 유형 함수는 클래스 이며 예제입니다. nils petersohn


0

매우 유용한 답변에 감사드립니다. 내가 사용하고 제이슨 멧새의 기능을 내 프로젝트에.

시간 초과를 설정하는 일반적인 방법이 작동하지 않으므로 선택적 시간 초과와 함께 사용하도록 확장했습니다. 참조 abhishekisnot의 질문에

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

var _very = {
    _deeply: {
        _defined: {
            _function: function(num1, num2) {
                console.log("Execution _very _deeply _defined _function : ", num1, num2);
            }
        }
    }
}

console.log('now wait')
executeFunctionByName("_very._deeply._defined._function", window, 2000, 40, 50 );

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.