0

私はこれを理解しようとしている時間の悪魔を持っています。別の関数の値を返す関数があります。2番目の関数内に3次条件があり、その戻り値は取得されません。理解できません。スコープの問題だと思いますが、解決できません。これはすべてjqueryプラグイン内にあります。

 somefunctionA: function(){
   var self = this;
   var data = somecollection_of_data;
   var storeReturn = $.map( data, function( obj, i) {
                            return (function(i){
                                 return self._returnFilteredData(id);
                            })(obj.i);
             });
 },

  __returnFilteredData: function(i){
                var self = this;
                  if(some_conditionals){
                     return (
                       self.url ?
                       (function(){
                           if(some_more_conditionals){
                               self._getDBdata();  <<-- NEVER FIRES OFF
                           }
                      }) : self._getDBdata()  <<--- THIS ONE FIRES OFF
                     )
                  }
               }
            },

したがって、最終的に発生するのは、storeReturn配列に「null」が含まれることです。これは、一部の条件では、最初の3次が失敗するためです。私はそれに入ることができません...テストするために。

「_getDBdata()」関数は、他のデータに基づいてハッシュを返すだけです。

何が起こっているかについてのアイデアはありますか?私はすべてを試しましたが、このスコープ/クロージャーの問題を解決できません。

4

3 に答える 3

3

まず、これはひどく複雑なので、この方法で行うのはやめるべきです。それを別々の部分に分割します。

第二に、その状況で無名関数を呼び出すことは決してなく、単にそれを返すだけです。別のセットを追加()するとそれが修正されるので、それを呼び出してその値を返します。

__returnFilteredData: function(i){
              var self = this;
                if(some_conditionals){
                   return (
                     self.url ?
                     (function(){
                         if(some_more_conditionals){
                             return self._getDBdata();
                         }
                    })() : self._getDBdata()
                   )
                }
             }
          },
于 2012-11-14T00:58:54.817 に答える
1

あなたの中の三項ステートメントで__returnFilteredData()は、の真実性に応じて、self.url2つの可能なもののうちの1つを返します。返されるものはすべて、に提供するコールバックから返されます$.map()

が正しければself.url、次の関数を返します。

                  (function(){
                       if(some_more_conditionals){
                           self._getDBdata();  <<-- NEVER FIRES OFF
                       }
                  })

...しかし、self.urlが偽の場合は、関数を呼び出した結果を返します。

                  self._getDBdata()

匿名関数の場合、実際には何も呼び出されませんが、匿名関数を呼び出したとしても、実際には結果self._getDBdata()を返さず、結果を返さずに条件付きで呼び出します。

これを、結果を返すすぐに呼び出される無名関数に変更できます。

__returnFilteredData: function(i){
          var self = this;
            if(some_conditionals){
               return (
                 self.url ?
                 (function(){
                     if(some_more_conditionals){
                         return self._getDBdata();  // added "return"
                     }
                })() : self._getDBdata()            // added "()" after "})"
               )
            }
         }
      },

...しかし、それでも、匿名関数は大文字と小文字が区別undefinedされないため、戻ることができelseます。メインブロックに入らない場合にも__returnFilteredData()戻ることができます。場合によっては許容できる結果かもしれませんが、これは現在のコード構造では明らかではありません。undefinedifundefined

匿名関数と3項を削除し、構造体を使用するようにコーディングすると、保守がはるかに明確で簡単になります。__returnFilteredData()if / else if / else if

于 2012-11-14T01:11:39.963 に答える
1

ただのコメント:

仕事ができないとおっしゃってif..elseいますが、木々の森が見えないと思います。匿名関数を削除するselfと、すべてが削除され、全体が非常に簡単になります。

this.url評価がtrueかfalseかにかかわらず、引き続きを呼び出すthis._getDBdata()ため、「さらにいくつかの条件付き」の部分を条件付きで実行する必要があることに注意してください。

__returnFilteredData: function(i) {
    if (some_conditionals) {
        if (this.url) {
            if (some_more_conditionals) {
                // do stuff
            }
        }
        return this._getDBdata();
    }
},
于 2012-11-14T03:28:08.917 に答える