Nếu một biến không có sẵn trong một hàm khi cần, thì nó sẽ được tìm kiếm trong chuỗi phạm vi (đóng cửa), nhưng lần khác đang được tìm kiếm trong chuỗi nguyên mẫu. Tôi đang cố gắng quấn quanh đầu tôi đang xảy ra khi nào. Tôi đã tự hỏi nếu có ai đó có thể vui lòng xóa sương mù cho tôi, hoặc giới thiệu cho tôi một số tài liệu thảo luận về chủ đề này một cách cụ thể.Tra cứu chuỗi phạm vi và xem xét nguyên mẫu - Đó là khi
Ví dụ, tôi có thể nói đúng: - Các đối tượng và do đó các biến công khai gắn với ngữ cảnh (điều này) luôn được tra cứu trong chuỗi nguyên mẫu? - Biến riêng tư luôn được tra cứu trong chuỗi phạm vi (tức là chuỗi chức năng trong ngữ cảnh thực thi)? - Có trường hợp nào khi chương trình đang tìm kiếm cả hai?
Tôi đã thử nghiệm ba trường hợp khác nhau (tìm kiếm chuỗi phạm vi, tra cứu mẫu và không tra cứu), nhưng rất tiếc Nó không giúp đủ để tìm hiểu điều này.
var Food = function(){
var t = 1; // for closure
this.timeToPrepare = function(){ // Scope chain lookup
console.log(t * 3);
};
this.timeToMake = function(){ // This is looked up in the prototype chain
console.log(this.t * 3);
};
this.timeToEat = function(t){ //No lookup
console.log(t * 3);
};
};
Food.prototype.t = 2;
(function(){
var pizza = new Food;
pizza.timeToPrepare(); //3
pizza.timeToMake(); //6
pizza.timeToEat(3); //9
})();
Cảm ơn!
Các chuỗi nguyên mẫu sẽ chỉ được tra cứu khi bạn truy cập một giá trị thuộc tính trên một đối tượng bằng cách sử dụng toán tử dấu chấm hoặc dấu ngoặc vuông (đối tượng có thể được tham chiếu bởi biến hoặc ngữ cảnh hiện tại 'this'). Nếu bạn tham chiếu một biến bằng mã định danh của nó, nó sẽ được tra cứu bắt đầu với phạm vi của hàm hiện tại, và sau đó làm việc đến các mức đóng cao hơn. Đây là lý do tại sao khi bạn định nghĩa một đối số được gọi là 't' cho một hàm, nó sẽ đổ bóng bất kỳ biến đóng nào được gọi là' t'. Điều tương tự nếu bạn khai báo một 'var t' trong một hàm. Không chính xác chắc chắn nếu điều này trả lời tất cả các câu hỏi của bạn. – sbking
Vì vậy, nói cách khác, tra cứu mẫu và tra cứu biến là hoàn toàn riêng biệt trong JavaScript. Nếu bạn tham chiếu một giá trị trực tiếp bởi một biến chứ không phải là một thuộc tính trên một đối tượng, JavaScript không có bất kỳ đối tượng nào trên chuỗi nguyên mẫu của nó để thực hiện tra cứu. – sbking
Cảm ơn đây chính là điều tôi đang nhận được! i) Có phải chuỗi tìm kiếm chuỗi phạm vi EITHER luôn luôn tra cứu hay không, nhưng không phải là cả hai? ii.) Nếu "bạn truy cập một giá trị tài sản trên một đối tượng bằng cách sử dụng toán tử dấu chấm hoặc dấu ngoặc vuông", có nghĩa là nó sẽ luôn được tra cứu trong chuỗi nguyên mẫu chứ không phải chuỗi phạm vi? - Nếu "bạn tham chiếu biến bằng mã định danh của nó" có nghĩa là nó luôn luôn được tìm kiếm trong chuỗi phạm vi? – Crocodile