2010-04-27 3 views
8

Tôi có mã sau đây. Tôi hy vọng sẽ thấy đối tượng "lưu trữ" trên bảng điều khiển firebug của tôi, nhưng tôi thấy đối tượng Window. Nó có bình thường không?Javascript trỏ đến đối tượng Window

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback){ 
     callback(); 
    }, 
    test2: function(){ 
     console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2); 

Trả lời

6

oArchive.action.test2 giúp bạn một tham chiếu đến một hàm callback sau đó trỏ tới, nhưng sau đó chức năng đó được gọi là sử dụng callback(), có nghĩa là nó không được gọi là một phương pháp và do đó this là đối tượng toàn cầu. Điểm mấu chốt là this không bị ràng buộc với một hàm: nó được xác định bởi cách hàm được gọi.

Trong trường hợp này bạn có thể làm một cách rõ ràng this trỏ đến đối tượng hành động (nhưng không phải là đối tượng lưu trữ) bằng cách sử dụng các hàm callback của call hoặc apply phương pháp:

test: function(callback) { 
    callback.call(this); 
}, 

Để có được nó this là đối tượng lưu trữ thay vào đó, bạn sẽ cần chuyển đối tượng lưu trữ trong:

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback, archive){ 
     callback.call(archive); 
    }, 
    test2: function(){ 
     console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2, oArchive);