2

一方、使用することevalは良いプログラミング手法ではありません。この質問は、教訓的な性質、またはより良い解決策を学ぶためのものです。

Javascriptの次の例を参照してください。

var foo = foo || {};
foo.bar = function(str) { alert(str); };

foo.bar('aaa'); // trigger alert('aaa')
window['foo']['bar']('bbb'); // trigger alert('bbb')

foo.bar('str')、、foo.nestedObj.bar(params)で動作する一般的な呼び出し元を探していますfoo.n2.n[1..99].bar(params)

それは私が次のようなものを呼び出すことができないためです:

param = [5,2,0];
call = 'foo.bar';
window[call](param); // not work

しかし、evalを使用して関数を呼び出すことができます。

param = [5,2,0];
call = 'foo.bar'
eval(call + '(param)'); // works

どうすればこれを行わずに行うことができます eval

4

2 に答える 2

5

私は以前にこれに答えました、しかしここでそれは再び行きます:

function genericFunction(path) {

    return [window].concat(path.split('.')).reduce(function(prev, curr) {
        return prev[curr];
    });

}

var param = [5, 2, 0];
var foo = { bar: function(param) { return param.length; } };

genericFunction('foo.bar')(param);

// => 3
于 2013-01-23T11:55:53.817 に答える
-1
callback = "foo.bar";
var p = callback.split('.'),
c = window; // "parent || window" not working in my tests of linked examples
for (var i in p) {
    if (c[p[i]]) {
        c = c[p[i]];
    } 
}
c('aaa');

そして、これは問題を解決します。ありがとう!

于 2013-01-23T12:11:52.350 に答える