2013-06-13 37 views
10

Trong ví dụ dưới đây, khi functionA() được gọi, các từ khóa this đề cập đến đối tượng chứa, vì vậy tôi có thể truy cập vào thuộc tính của nó (ví dụ theValue)javascript đối tượng theo nghĩa đen - chức năng lồng nhau và "này" từ khóa

My câu hỏi: Làm cách nào để tôi tham chiếu đến thuộc tính của myObj từ trong số lồng nhaufunctionB()?

var myObj = { 
    theValue: "The rain in Spain", 
    functionA: function() { 
     alert(this.theValue); 
    }, 
    moreFunctions: { 
     functionB: function() { 
      alert(????.theValue); 
     } 
    } 
} 

myObj.functionA(); 
myObj.moreFunctions.functionB(); 

Xin cảm ơn trước.

Trả lời

6

gọi ngay để giải thoát!

var myObj = (function() { 
    var that = { 
     theValue: "The rain in Spain", 
     functionA: function() { 
      alert(this.theValue); // or that.theValue, both work here 
     }, 
     moreFunctions: { 
      functionB: function() { 
       alert(that.theValue); 
      } 
     } 
    }; 
    return that; 
}()); // <-- immediate invocation !! 

Bạn có thể phân hủy nó thậm chí còn hơn nữa:

var myObj = (function() { 
    function functionA() { 
     alert(that.theValue); 
    } 
    function functionB() { 
     alert(that.theValue); 
    } 
    var that = { 
     theValue: "The rain in Spain", 
     functionA: functionA, 
     moreFunctions: { 
      functionB: functionB 
     } 
    } 
    return that; 
}()); 

Nếu bạn quen với OOP, bạn có thể sử dụng để làm cho tin biến.

+0

Tôi nhầm lẫn về câu trả lời để chấp nhận. gợi ý của elclanrs ('alert (myObj.theValue);') hoạt động (không cần tái cấu trúc), nhưng giải pháp Frits (và nghiên cứu thêm một chút) đã cung cấp cho tôi thông tin về đóng cửa, lời gọi ngay lập tức và cách sử dụng để tạo các biến riêng tư, vì vậy tôi chấp nhận câu trả lời này trên cơ sở đó. Cảm ơn mọi người. – Bumpy

2

Thực tiễn phổ biến là xác định biến "tự" và sử dụng thay vì từ khóa này. Điều này giúp khi bạn muốn thêm phạm vi hoặc tạo một lớp.

var myObj = new function(){ 
    var self = this; 
    this.theValue = "The rain in Spain"; 
    this.functionA = function() { 
     alert(self.theValue); 
    }, 
    this.moreFunctions = { 
     functionB: function() { 
      alert(self.theValue); 
     } 
    } 
    }(); 

    myObj.functionA(); 
    myObj.moreFunctions.functionB(); 

Một khả năng khác là sử dụng phương pháp Function.prototype.bind ECMA5. Để đơn giản, bạn có thể ràng buộc một phương thức từ khóa này. Follow the link or use a search engine for more details. Nếu bạn sử dụng phương pháp này, hãy cẩn thận rằng nó không tương thích với các trình duyệt cũ hơn, nhưng liên kết được cung cấp cho thấy triển khai thay thế bạn có thể sử dụng để triển khai phương pháp .bằng trong các trình duyệt cũ hơn.

var myObj = new function(){ 
    this.theValue = "The rain in Spain"; 
    this.functionA = function() { 
     alert(this.theValue); 
    }.bind(this); 
    this.moreFunctions = { 
     functionB: function() { 
      alert(this.theValue); 
     }.bind(this) 
    }; 
}(); 

myObj.functionA(); 
myObj.moreFunctions.functionB(); 
+0

Nop: http://jsbin.com/ofehap/1/edit, 'this' trong đó là' window'. 'this' áp dụng hàm _inside_ và ngữ cảnh phụ thuộc vào _how bạn gọi_ hàm đó. – elclanrs

+1

Tôi nghĩ rằng bạn đang thiếu điểm. Sau khi chỉnh sửa của bạn nó sẽ làm việc nhưng bạn vừa thay đổi cấu trúc dữ liệu. Thêm vào tùy chọn với 'bind' sẽ không hoạt động vì' this' vẫn là 'window'. – elclanrs

+0

Bạn nói đúng, khi tôi đọc nó lần đầu tiên tôi đã có một chức năng trong đầu, chứ không phải là một cấu trúc JSON đơn giản, sạch sẽ. Tôi đã sửa mã để làm cho nó hoạt động như tôi dự định ban đầu, nhưng tôi không khuyến khích nó làm câu trả lời nếu bạn muốn giữ nó sạch JSON. Tuy nhiên, phạm vi làm cho nó hấp dẫn hơn. – andrewjs