2013-10-18 12 views
6

Tôi đang lặp qua một mảng bằng cách sử dụng forEach trong một trong các phương thức của Lớp của tôi. Tôi cần quyền truy cập vào cá thể của lớp bên trong forEach nhưng này không được xác định.Truy cập điều này trong kết quả vòng lặp forEach trong không xác định

var aGlobalVar = {}; 

(function() { 

    "use strict"; 

    aGlobalVar.thing = function() { 
     this.value = "thing"; 
    } 

    aGlobalVar.thing.prototype.amethod = function() { 
     data.forEach(function(d) { 
     console.log(d); 
     console.log(this.value); 
    }); 
} 
})(); 

var rr = new aGlobalVar.thing(); 
rr.amethod(); 

Tôi có một fiddle tôi đang làm việc ở đây: http://jsfiddle.net/NhdDS/1/.

+1

Tôi cũng có các biến cục bộ trong tập lệnh đầy đủ. Đây chỉ là một đoạn trích được rút gọn cho ví dụ này. –

+0

Chắc chắn, có vẻ hơi lạ. –

+1

@ Qantas94Heavy: Cũng cho phép anh ấy làm những thứ bên trong nghiêm ngặt. –

Trả lời

17

Trong chế độ nghiêm ngặt nếu bạn gọi một hàm không thông qua một tài liệu tham khảo tài sản và không có quy định cụ thể những gì this nên được, đó là undefined.

forEach (spec | MDN) cho phép bạn nói gì this nên được, đó là (tùy chọn) đối số thứ hai bạn vượt qua nó:

aGlobalVar.thing.prototype.amethod = function() { 
    data.forEach(function(d) { 
    console.log(d); 
    console.log(this.value); 
    }, this); 
    // ^^^^ 
} 

Cách khác, arrow functions được thêm vào JavaScript vào năm 2015. Kể từ mũi tên đóng trên this, chúng tôi có thể sử dụng một cái cho điều này:

aGlobalVar.thing.prototype.amethod = function() { 
    data.forEach(d => { 
    console.log(d); 
    console.log(this.value); 
    }); 
} 
+0

Không biết về điều này! Hoàn toàn rõ ràng hơn so với lưu trữ ** này ** trong một var tạm thời và sử dụng trong ** foreach ** context. Cám ơn vì đã chia sẻ! –

+0

Tôi sẽ làm điều này. Tôi đang xây dựng một ứng dụng trên Chromium để ECMA5 là tốt trong trường hợp này. Cảm ơn –

+0

Tôi không cho rằng có một cách trong TypeScript để nói cho IDE loại 'this' khi bên trong vòng lặp' forEach'? Tôi hiện đang làm như sau 'const tự = này' sau đó sử dụng' self' có sau khi để có được tự động hoàn thành từ IDE của tôi - không lý tưởng –

4

Vì bạn đang sử dụng chế độ nghiêm ngặt, khi hàm được gọi không phải là thuộc tính của đối tượng, this sẽ có giá trị undefined theo mặc định (không phải đối tượng chung). Bạn nên lưu trữ giá trị của nó bằng tay:

var aGlobalVar = {}; 

(function() { 
    "use strict"; 

    aGlobalVar.thing = function() { 
     this.value = "thing"; 
    }; 

    aGlobalVar.thing.prototype.amethod = function() { 
     var self = this; 
     data.forEach(function (element) { 
      console.log(element); 
      console.log(self.value); 
     }); 
    }; 
})(); 

var rr = new aGlobalVar.thing(); 
rr.amethod(); 

Ngày nay, với ES2015 bạn cũng có thể sử dụng arrow functions, trong đó sử dụng các giá trị this của hàm bên ngoài:

function foo() { 
    let bar = (a, b) => { 
    return this; 
    }; 

    return bar(); 
} 

foo.call(Math); // Math 

T.J. Giải pháp của Crowder khi sử dụng đối số thứ hai của forEach cũng hoạt động tốt nếu bạn không thích ý tưởng biến tạm thời (mã ES5: hoạt động trong bất kỳ trình duyệt nào hiện nay, ngoại trừ IE8-).

+0

Cảm ơn. Tôi biết điều này. Tôi không biết tại sao tôi không dùng nó! Btw nên được console.log (thing.value); trong đoạn mã trên? –

+0

@MikeRifgin: haha, vâng. –

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