2014-01-29 5 views
0

Можно ли вызвать функцию в javascript из строки, где функция находится в объекте?Вызов функции Javascript из строки

например: вызов «main.object.doSomething()» (обратите внимание, что это строка) из объекта ниже.

window.main = { 
    object: { 
     doSomething: function(){ 
      alert('Called'); 
     } 
    } 
} 

--- Update ---

... без использования Eval();

ответ

2
window.main = { 
    object: { 
     doSomething: function(){ 
      alert('Called'); 
     } 
    } 
} 

function callFromString(aString) { 
    var parts = aString.split("."); 
    var obj = window; 
    for (var i = 0; i < parts.length - 1; i++) { 
    obj = obj[parts[i]]; 
    if (!obj) 
     return; 
    } 
    // strip() at the end of parts[parts.length - 1] if they are present 
    if (obj[parts[parts.length - 1]]) 
    obj[parts[parts.length - 1]](); 
} 

callFromString("main.object.doSomething"); 

http://jsfiddle.net/79nWH/

+0

Я думал сделать что-то подобное от @ OverlappingElvis задумки. большое спасибо –

1

Вы можете использовать eval, так:

eval("main.object.doSomething()"); 

Но eval зло - попытаться избежать ,

0

Допустим, у вас есть строка, как:

var funcString = "window.main = { 
    object: { 
     doSomething: function(){ 
      alert('Called'); 
     } 
    } 
}"; 
eval(funcString); 

и, если вы уже ваша функция, определенная на странице, вы можете вызвать его с 2-мя различными способами, используя Eval (что ни один эксперт JS никогда бы не предлагать используя его, вы должны использовать его только тогда, когда у вас нет какого-либо другого варианта):

eval("main.object.doSomething()"); 

и другой способ использует анонимную функцию:

Function("main.object.doSomething();")(); 
1

Не используйте eval! Есть many good reasons not to use eval, и в большинстве случаев нет оснований для этого. Вместо этого вы можете использовать синтаксис поиска свойств строки, чтобы получить метод, который вы ищете: main.object.doSomething() эквивалентен main.object['doSomething'](). Так, например, если вы хотите вызвать функцию, основанную на шнурке, вы могли бы сделать:

var methodToCall = 'doSomething'; 
main.object[methodToCall](); 

Если положить круглые скобки сразу после поиска недвижимости выглядит странно для вас, вы можете также сделать main.object[methodToCall].call(null).

Смежные вопросы