2016-10-05 12 views
0

と名前で関数を呼び出す:避け()私はこの単純なスイッチブロック持っている唯一の動的な文字列

function modifyServiceContractView(schema) { 
    ... 
} 

function modifyContactView(schema) { 
    ... 
} 


function addExtraInfoToSchema(defName, schema) { 

    switch (defName) { 

    case 'ServiceContractView': 
     return modifyServiceContractView(schema); 
     break; 

    case 'ContactView': 
     return modifyContactView(schema); 
     break; 

    default: 
     return schema; 

    } 

} 

の代わりに、スイッチブロックをハードコーディングし、それだけではなく、このようなものを持っていいだろう。

function modifyServiceContractView(schema) { 
    ... 
} 

function modifyContactView(schema) { 
    ... 
} 


function addExtraInfoToSchema(defName, schema) { 

    return eval('modify' + defName+ '(schema)'); 

} 

eval()を使用しないとこれを行うより良い方法はありますか?

うまくいけば私の質問は明らかです。

+2

はい、あなたの機能を格納するオブジェクトリテラルを使用..あなたは、FUNCを行うことができ、私は方法があることを知っていたおかげで:)(スキーマ)[+ defName「を変更」] – Keith

+0

当たり前lulz –

+0

答えとして追加できます –

答えて

1

キーが名前で値が関数であるオブジェクトを使用します。あなたの関数がグローバルである場合

var modifyFuncs = { 
    ServiceContractView: modifyServiceContractView, 
    ContactView: modifyContactView 
}; 

function addExtraInfoToSchema(defName, schema) { 
    if (defName in modifyFuncs) { 
     return modifyFuncs[defName](schema); 
    } else { 
     return schema; 
    } 
} 
1

あなたはこれを行うことができます。

return window['modify' + defName] ? window['modify' + defName](schema) : schema; 
+1

'window'はノードに存在しません。また、それらをグローバル(ノード内)にすることは悪い決定であり、不要です。 – mscdex

1

あなたは、オブジェクトのあなたの機能を保存する名前でそれらにアクセスすることができました。

var modify = { 
 
    ServiceContractView: function(schema) { 
 
    console.log('ServiceContract', schema); 
 
    }, 
 
    ContactView: function(schema) { 
 
    console.log('Contact', schema); 
 
    } 
 
}; 
 

 
function addExtraInfoToSchema(defName, schema) { 
 
    return modify[defName](schema); 
 
} 
 

 
addExtraInfoToSchema('ServiceContractView', 1); 
 
addExtraInfoToSchema('ContactView', 2);

関連する問題