4

匿名関数を使用しないことで、コードをより理解しやすいスタンドアロン関数にフラット化することで、コードが読みやすくなり、自己文書化できるようになることがわかりました。したがって、次の構成を次のように分割したいと思います。

function Save() {
   myVal = 3.14 // some arbitrary value
   $('#myID').each(function(index,element) {
      if ($(this).val() === myVal) {}
   });
}

の中へ:

function Save() {
   myVal = 3.14 // some arbitrary value
   $('#myID').each(myFunction);
}

function myFunction(index,element) {
   if ($(this).val() === myVal) {}
}

ここで .bind を使用する際の問題は、各メソッド内で $(this) の値が失われるため、myVal を myFunction にバインドできるとは思いません。

多分私はelement代わりに使用できますthisか?

編集 1: サンプル セレクターに #myID の代わりに .myClass を使用する必要がありました。

編集2:バインドが機能するとは思わないため、提案されたソリューションではバインドを使用していません。

編集 3: 最初の例の方が読みやすいと言ってくれてありがとう。私は言語を探求し、さまざまな考えを試しています。

4

3 に答える 3

4

そして何について :

function Save() {
    myVal = 3.14 // some arbitrary value
    $('#myID').each(myFunction(myVal));
}

function myFunction(myVal) {
    return function(index, element) {
        if ($(this).val() === myVal) {}
    }
}
于 2013-04-09T15:29:10.490 に答える
2

thisこのコンテキストでは同じになります。アクセスできなくなるのはmyVal. Function.bind原本保持(通話時間)の指定ができないので使えないのは正解です。this

の変更されたバージョンを使用して、呼び出してmyValいる同じを渡し、保持する方法は次のとおりです。thisFunction.bindmyBind

/**
 * Binds the given function to the given context and arguments. 
 *
 * @param {function} fun The function to be bound
 * @param {object} context What to use as `this`, defaults 
 *        to the call time `this`
 * @param {object[]} customArgs Custom args to be inserted into the call
 * @param {number} index Where to insert the arguments in relationship
 *        to the call time arguments, negative numbers count from the end.
          That is, -1 to insert at the end. Defaults to a 0 (beginning of list).
 *        
 */
function myBind(fun, context, customArgs, index) {
      return function() {
          // Default the index
          index = index || 0;
          // Create the arguments to be passed, using an old trick
          // to make arguments be a real array
          var newArgs = Array.prototype.slice.call(arguments, 0);
          // Tack the customArgs to the call time args where the user requested
          var spliceArgs = [index, 0].concat(customArgs); 
          newArgs.splice.apply(newArgs, spliceArgs);
          // Finally, make that call
          return fun.apply(context || this, newArgs);  
      }
}


function Save() {
   myVal = 3.14 // some arbitrary value
   $('#myID').each(
      // myFunction wil be called with myVal as its last parameter
      myBind(myFunction, null, [myVal], -1)
   );
}

function myFunction(index, element, myVal) {
   if ($(this).val() === myVal) {
       // do it here
   }
}

この関数の柔軟性を示すために、複数の引数をバインドしてみましょう。呼び出し時の引数の先頭に挿入する必要があります

function Save() {
   var myVal = 3.14, val2 = 6.28; // some arbitrary values
   $('#myID').each(
      // myFunction wil be called with myVal and val2 as its first parameter
      myBind(myFunction, null, [myVal, val2], 0);
   );
}

// Since I don't need element, it's already available as this, we don't 
// declare the element parameter here
function myFunction(myVal, val2, index) {
   if ($(this).val() === myVal || $(this.val() === val2)) {
       // do it here
   }
}

これは Samuel Caillerie とほぼ同じ答えです。唯一の違いは、Function.bindbindthisではなく、引数だけの別のバージョンを作成することです。このバージョンのもう 1 つの利点は、バインドされた引数を挿入する場所を選択できることです。

于 2013-04-09T15:32:10.490 に答える
2

へのアクセスを失うことはありませんthis。主にその関数が の定義を持たないスコープで定義されているため、内で が不明なmyValため、へのアクセスを失っています。myValmyFunctionmyVal

あなたができることは次のようなものです:

function myFunction(index, element, myVal) {
   if ($(this).val() === myVal) {}
}

その後:

function Save() {
   myVal = 3.14 // some arbitrary value
   $('#myID').each(function(index, element) {
       myFunction.call(this, index, element, myVal);
   });
}

このようにして、内部myFunctionに多くのロジックがある場合でも、それを分離して、のコールバックmyFunctionから呼び出すことができ.each)ます。(最初の引数) の明示的な値を渡すことができるため、それmyFunctionは呼び出されていません。したがって、 へのコールバック内にあるものと同じです。.callthisthisthis.each

正直なところ、最初のオプションの方がずっと読みやすく、このようにコードを分割してもあまりメリットはありません。

于 2013-04-09T15:28:42.240 に答える