2015-12-15 9 views
11

Iはangular.forEach機能を解析した:ここなぜangular.for各コンテキスト?

angular.forEachのコードである:

var values = {name: 'misko', gender: 'male'}; 
var log = []; 

angular.forEach(values, function(value, key) { 
    this.push(key + ': ' + value); 
}, log); 

expect(log).toEqual(['name: misko', 'gender: male']); 

コンテキストの記述がある:イテレータ関数のコンテキスト(本)になる

オブジェクト。

私はいくつかの質問を思い付いた:

使用とするときは、パラメータコンテキストに有用であるのはなぜ?!

なぜこのの代わりにログ変数

答えて

6

提供する例では、thisを使用するか、直接log arrayを使用することは同じです。これは、forEach methodおよびlog arrayで使用されるcallbackが同じscopeで定義されているためです。

ただし、callbacklog arrayとは異なるscopeの内部に定義されている場合があります。その後、呼び出しは次のようになります。それは異なるscopeで定義されているlog arrayを参照すると、この場合には

angular.forEach(values, getNames, log); 

を、我々は、コールバックの内側にthis使用する必要があります。

EDIT:

私が説明したものを示し、このJSFiddle demo、次のコードを参照してください。

var getNames = function(value, key) { 
    this.push(key + ': ' + value); 
}; 

var processObject = function(){ 
    var log = []; 
    // Now getNames callback is defined in a different 
    // scope than log 
    angular.forEach(values, getNames, log); 
    return log; 
} 

var values = {name: 'misko', gender: 'male'}; 
var resultArray = processObject(values); 
// This gives same result as your exmple 
alert(resultArray); 
+0

Ohhhhhh ....今、私は関数が動作として渡せることがわかります。 NIce !!! – Lucas

2

angular.forEach()は使用しませんでしたが、見た目はかなりシンプルです。

var hello = { 
     message: 'Ok' 
    }; 

    angular.forEach([' I', ' said', ' hello'], function (value) { 
     this.message += value; 
    }, hello); 

    console.log(hello.message); 

1 /これは基本的に 'コンテキスト'パラメータで参照するオブジェクトを更新できるように基本的に 'hello'と言います。ユースケースは本当に広いです...

2 /実行コンテキストとは何かがあると思います。それで、thisはangular.forEachがどのように実装されているかと関係があります。 anglejsのソースコードを確認してください。

+0

ご注意いただきありがとうございます。 – Lucas

+0

乾杯人。良い質問btw。 –

関連する問題