2013-07-08 13 views
5

オブジェクトのメソッドを関数の引数として渡すときには、メソッドのコンテキスト(this)が正しく設定されていることを確認するために `bind 'を使う必要があります。そして、私のコードにはたくさんのバインドがあります...これはJSコードを書くためのきれいな方法ですか?メソッドを渡すために推奨されるデザインパターンは何ですか?多分、私はオブジェクト全体を渡すか、オブジェクトを再設計する必要がありますか?JSオブジェクトのメソッドを渡すには?

ありがとうございます。

参考までにここにコードを貼り付けました。これは間違いなく良いコードです。たとえば、多分、複数のSQL文を1つずつ呼び出すのではなく、使用したいと思うかもしれません。

function insertDB(response, postData) { 
    var mysql  = require('mysql'); 
    var async  = require('async'); 
    var connection = mysql.createConnection({ 
    host  : 'localhost', 
    user  : 'user', 
    password : 'pswd', 
    database : 'mydb', 
    }); 

    async.series([ 
    connection.connect.bind(connection), 
    async.apply(connection.query.bind(connection), 
     "CREATE TABLE IF NOT EXISTS concepts ("+ 
     "name VARCHAR(64) NOT NULL,"+ 
     "priority INT NOT NULL DEFAULT 0,"+ 
     "date DATE NOT NULL,"+ 
     "notes VARCHAR(256),"+ 
     "PRIMARY KEY (name))"), 
    async.apply(connection.query.bind(connection), 
     "INSERT INTO concepts VALUES('" + 
     postData["word"] + "',0,CURDATE(),'')"), 
    connection.end.bind(connection) 
    ], 
    function(err, result) { 
    if (err) console.error(err); 
    }); 
} 
+2

はあなたの現在のコードを共有したいの呼び出しと適用の違いがあるの呼び出しは、カンマのようなarguementsを区切って取りコードの繰り返しを避けるためにどのように改善できるかを議論することができましたか? –

+0

'関数(オブジェクト、メソッド、引数){オブジェクト[メソッド] .apply(オブジェクト、引数); } ' – mishik

+3

これはおそらく[codereview](http://codereview.stackexchange.com)に適しています。 –

答えて

1

これを行うには、callまたはapplyを使用できます。どちらもスコープを設定し、必要なargを渡すことができます。

connection.connect.call(connection, arg1, arg2, arg2);

そして、このような引数の配列を受け取り適用されます:

var args = [ arg1, arg2, arg3 ];
connection.connect.apply(connection, args);

関連する問題