2017-09-11 3 views
-1

私は以下の関数を定義しています。console.log(this)を元の配列[3,4,5]に戻したいと思います。ただし、ウィンドウオブジェクトを返します。私は適用とバインドを使用しようとしましたが、うまくいきませんでした。グローバル関数でこのキーワードに特定のオブジェクトをバインドする方法はありますか?

申し訳ありませんが、私はJavascriptを初めて使用しています。ありがとうございます!

function Filterstuff(arr) { 
    var currentArray = arr; 
    return (function arrayFilterer(predicate,callback) { 
     if(typeof predicate != "function") 
      return currentArray; 
     currentArray = currentArray.filter(predicate); 
     callback.apply(arr,currentArray); // call back apply 
     if(typeof callback == "function") 
      callback(currentArray); 
     return arrayFilterer; 
    }); 
} 



var arrayFilterer = Filterstuff([3,4,5]); 

arrayFilterer(function (elem) { 
    return elem !== 4; 
}, function (currentArray) { 
    console.log(this); 
    console.log(currentArray); 
}); 

結果:ラウンド1にconsole.log(これは)元の配列を返しますが、ラウンド2には、ウィンドウには、はい、applyが働くだろう再びresult

+3

なぜ 'this'はそのコンテキストで配列になるのですか?なぜあなたはそれを望んでいますか? – adeneo

+2

また、列挙可能なプロパティをそのような 'Array.prototype'に追加することは非常に悪い考えです。 'Array.prototype'を拡張したい場合は、' Object.defineProperty'を使用して、列挙できないプロパティを定義してください。 –

+0

何かをバインドする必要のある関数にログを入れないでください – Rajesh

答えて

1

返す、あるいはさらに簡単call

function filterStuff(originalArray) { 
    return function arrayFilterer(predicate, callback) { 
     var resultArray = originalArray.filter(predicate); 
     callback.call(originalArray, resultArray); 
//    ^^^^^^^^^^^^^^^^^^^ 
    }; 
} 
+0

こんにちは、質問にお答えいただきありがとうございます。呼び出しメソッドを使用した後。 console.log(this)は元の配列を返しましたが、ウィンドウオブジェクトも返します。どのように元の配列だけを返すかどうか確認しますか? – Snailwalker

+0

@Sailwalker Wat?それは両方になることはできません。多分、あなたは 'this'キーワードを別の関数で見ていたでしょうか? – Bergi

+0

私はそれがフィルタループのためだと思います。配列の長さが3であるため、2回ループしなければなりません。基本的には、2番目のconsole.log(this)はウィンドウオブジェクトを再度返します。私はそれに対処する方法を見つけることができませんでした。 – Snailwalker

関連する問題