2015-12-15 21 views
11

tôi đã phân tích angular.forEach chức năng:Tại sao nên sử dụng ngữ cảnh góc cạnh?

Đây là mã của 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']); 

Các mô tả về bối cảnh là:

Object để trở thành bối cảnh (this) cho hàm iterator .

tôi đã đưa ra một số câu hỏi:

Tại sao sử dụng và khi nào là hữu ích tham số bối cảnh?!

Tại sao sử dụng này thay vì biến nhật ký?

Trả lời

6

Trong ví dụ bạn cung cấp, việc sử dụng this hoặc trực tiếp là log array là giống nhau. Đó là vì callback được sử dụng trong forEach methodlog array được xác định trong cùng một scope.

Tuy nhiên, có thể có một số trường hợp trong đó callback được xác định bên trong scope khác với log array. Sau đó, các cuộc gọi nên xem xét như sau:

angular.forEach(values, getNames, log); 

Trong trường hợp này, chúng ta nên sử dụng this bên trong gọi lại vì nó sẽ tham khảo log array được định nghĩa trong một khác nhau scope.

EDIT:

Xem JSFiddle demo và sau mã này cho thấy những gì tôi đã giải thích.

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 .... bây giờ tôi có thể thấy rằng hàm có thể được chuyển thành hành vi. Tốt đẹp!!! – Lucas

2

Không bao giờ được sử dụng angular.forEach() nhưng có vẻ khá đơn giản.

var hello = { 
     message: 'Ok' 
    }; 

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

    console.log(hello.message); 

1/Nó sẽ đăng nhập 'Ok tôi đã nói xin chào' về cơ bản, thông số 'ngữ cảnh' sẽ cho phép bạn cập nhật bất kỳ đối tượng nào bạn sẽ tham chiếu. Trường hợp sử dụng thực sự rộng ...

2/Tôi nghĩ rằng nó có liên quan đến ngữ cảnh thực thi. môi trường từ vựng để nó có nghĩa rằng this phải được liên quan với cách angular.forEach được thực hiện. Chỉ cần kiểm tra mã nguồn của angularjs.

+0

Cảm ơn sự quan tâm. – Lucas

+0

Chúc mừng người đàn ông. Câu hỏi hay btw. –

Các vấn đề liên quan