2017-01-03 7 views
1

実行したい関数の名前を含む変数があると仮定して、windowを使って実行することができます。変数からオブジェクト内の関数を実行する

var func = "myFunc", 
    myFunc = function(){ ... }; 

window[func](); // run the function in the func var 

ただし、意図した機能がオブジェクトの内部にある場合は機能しません。

var obj = { 
    foo: { 
    hey: function(){ ... } 
    } 
}; 

obj.foo.hey(); // this runs 


var func = "obj.foo.hey"; 

window[func](); // this doesn't 

eval()が付属していますことを、多くのセキュリティ上の考慮事項を導入しないように、私はeval()を使用することができますが、それはそれを回避することができますかしら。

上記のように関数がオブジェクト内にある場合、変数で指定された関数を実行するにはどうすればよいですか?

+0

http://stackoverflow.com/questions/1184123/is-it-possible-to-add-dynamically-named-properties-to-javascript-object – Teemu

答えて

1

分割されたfuncを反復して、歩いたオブジェクトの結果を返すことができます。

function getValue(object, path) { 
 
    return path.split('.').reduce(function (o, k) { 
 
     return (o || {})[k]; 
 
    }, object); 
 
} 
 

 
var obj = { foo: { hey: function() { console.log('hey'); } } }, 
 
    func = "obj.foo.hey"; 
 

 
getValue(window, func)(); 
 
(getValue(window, 'bar') || function() {})(); // default function, prevent exception

0

あなたはの1つの文字列の下にネストプロパティを渡すことができます。それは動的に行う必要があります。

var obj = { 
 
    foo: { 
 
    hey: function(){console.log("i run")} 
 
    } 
 
}; 
 

 
obj.foo.hey(); // this runs 
 

 

 
var route = ["obj","foo","hey"], 
 
    func = route.reduce((f,r) => f[r], window); 
 

 
func()

関連する問題