2014-10-12 2 views
3

"User.find"와 같은 문자열에서 함수를 동적으로 호출하려고합니다. 함수가 존재하면 스크립트는 객체 User에서 find() 함수를 호출합니다.Javascript에서 동적으로 함수 호출

var User = {}; 
User.find = function(){ 
    return 1; 
} 

var input = 'User.find'; 
var some_data_array = {name: 'John Doe'}; 
var method = input.toString().split('.'); 
var nameObj = method[0].substring(0,1).toUpperCase() + method[0].substring(1); 
var methodToCall = method[1]; 

nameObj.call(methodToCall, some_data_array); 

그러나 그것은 항상 반환 : 여기에 내가 시도 무엇

nameObj.call(methodToCall, some_data_array); 
TypeError: Object User has no method 'call' 

어떤 생각을? 나는 node.js 문제이기 때문에 창을 사용할 수 없다. 스크립트는 브라우저에서 실행되지 않는다. 동적으로 함수를 호출

+0

'nameObj'는 * 문자열 *이 아니라 함수입니까? – Bergi

+0

동적 인 경우'eval'을 사용해보십시오. –

+0

그래서 내가 여기서 묻습니다. 동적 객체에서 함수를 호출하는 방법을 모르겠습니다. – Codel

답변

7

완전히 오해했습니다. call()입니다.

call()을 사용하면 this이 다른 메소드를 호출 할 수 있습니다.

당신은 이름을 속성으로 싶어 :

object[methodName](arg1, arg, ...); 
+0

답변 해 주셔서 감사합니다. 그러나 http://jsfiddle.net/74kmm6bp/ 또는 어쩌면 사용법을 알지 못했습니다. – Codel

+0

이것은 OP가 원하는 것이 아닙니다. 적어도 OP의 문제는 분명하지 않다. 그는 메소드 *** (메소드 이름)뿐만 아니라 *** *** 오브젝트도 없다. –

+0

@ Codel96 :'nameObj'는 문자열입니다. 그 이름으로 전역 변수를 얻으려면, 같은 구문을 사용하십시오 :'window [nameObj]'. – SLaks

2

당신이이 간단한 문장 하나에 아래 코드를 끓일 수없는 경우 fn.callfn.apply

fn.call(context, arg1, arg2, arg3); 

또는

fn.apply(context, [arg1, arg2, arg3]); 

입니다 사용하는 방법, 은 (는)이 아닙니다.

+1

답변 해 주셔서 감사합니다하지만 그것은 정말 도움이되지 않습니다. 나는 내 문제에 대한 다른 가능한 해결책을 찾고있다. 당신이 말하는대로 내 문제에서 그 기능을 사용할 수있는 것처럼 보이지 않습니다. – Codel

+0

답변에 대한 설명이나 소개로 사용하는 것이 좋습니다. 그것이 그렇듯 실제로 질문에 대답하지 않습니다. – slebetman

0

은 무엇 당신이 원하는 것은 글로벌 개체에 액세스 할 수 있습니다.

이 작동합니다 : 당신은 실제로 달성 할 수

var User = {}; 
User.find = function(){ 
    return 1; 
} 

var input = 'User.find'; 
var some_data_array = {name: 'John Doe'}; 
var method = input.toString().split('.'); 
var nameObj = method[0].substring(0,1).toUpperCase() +method[0].substring(1); 
var methodToCall = method[1]; 

"use strict"; 
var global = (1,eval)("this"); 
alert(global[nameObj][methodToCall](some_data_array)); 
+0

제 코드로는 작동하지 않습니다 : http://jsfiddle.net/74kmm6bp/1/ – Codel

+0

콘솔에서 실행되는 jsfiddle에서는 작동하지 않습니다. 편집 : 나는 이것이 피들이 JS를 실행하는 방법 때문이라고 가정하고 있으며 전역 범위 내에서'User' 개체를 선언하지 않습니다. – EvilZebra

+0

다음과 같은 결과가 나옵니다. TypeError : 객체의 'connect'속성이 객체입니다. – Codel

1

. 먼저 namespace/function/object가 정의 된 scope을 얻어야합니다.

예를 들어 코드에서 나는 window이라고 가정합니다.

그래서 원하는 결과를 생성 할 코드의 작은 수정 :

var User = {}; 
User.find = function(x){ 
    alert(x); 
} 

var input = 'User.find'; 
var some_data_array = {name: 'John Doe'}; 
var method = input.toString().split('.'); 
var nameObj = global[method[0]]; 
var methodToCall = method[1]; 

nameObj[methodToCall](some_data_array.name); 

마크 global[]의 사용을. 이것이 시작하는 곳입니다.

[편집 됨] * nodejs에서 사용되는 것으로 window 대신 global을 사용하는 수정 된 코드.

+0

노드가있는 서버 측에서 작동하기 때문에 창을 사용할 수 없습니다. – Codel

+0

@ Codel96 : 그 이유는 내가 썼다 - 당신은'scope'을 얻을 필요가 있고 나의 예제는'window' 스코프를 사용하고 있습니다. 아마도 다른 범위 (global)를 가질 것이다. 나는 코드를 바꿀 것이다. – sudipto

+0

아, 죄송하지만, 그 범위를 어떻게 얻을 수 있습니까? – Codel

관련 문제