2015-01-11 19 views
7

Các hàm trong javascript cũng là một đối tượng và có thể có các thuộc tính. Vì vậy, có cách nào để truy cập các thuộc tính của nó từ bên trong cơ thể chức năng của chính nó?Truy cập các thuộc tính của đối tượng hàm từ bên trong hàm chức năng

như thế này

var f = function() { 
    console.log(/*some way to access f.a*/); 
}; 
f.a = 'Test'; 
f(); //should log 'Test' to console 
+2

Uh, chỉ cần sử dụng 'f.a'? – Bergi

+0

Vâng, ví dụ của bạn sử dụng một tham chiếu, vì vậy bạn nhận được câu trả lời cho phù hợp. – tishma

Trả lời

1

arguments.callee là chính chức năng và không bị ảnh hưởng bởi tên hàm.

var f = function() { 
    console.log(arguments.callee.a); 
}; 
f.a = 'Test'; 
f(); 
+1

Câu trả lời hay! Tôi tin rằng đây là cách tiếp cận sạch sẽ nhất. Trong câu trả lời torazaburo, việc liên kết hàm sẽ tự mất tham chiếu của cha mẹ khi sử dụng 'this', và câu trả lời Christos không hoạt động nếu hàm không có định danh (tức là hàm ẩn danh) – Daniel

+0

Tuy nhiên khi sử dụng phương pháp này trong đệ quy cách thức, giá trị của 'this' sẽ khác nhau cho mỗi cuộc gọi, cái đầu tiên sẽ là cha của hàm, những cái tiếp theo sẽ là thuộc tính đối số của cuộc gọi trước, vì chúng ta sẽ gọi hàm từ đối tượng đối số, sử dụng đối số .callee, Chúng ta sẽ phải sử dụng arguments.callee.apply (this)! – Daniel

+0

Nhưng với mục đích thực sự của câu hỏi này, quả thực là câu trả lời hay nhất! – Daniel

2

Bạn có thể chỉ cần sử dụng này:

console.log(f.a); 

Nếu f được thực thi, f(), trước f.a = 'Test'; bạn sẽ nhận được undefined trong giao diện điều khiển, vì không có tài sản nào với tên/khóa a được xác định. Sau khi thực hiện f.a = 'Test';, tên/khóa a sẽ được xác định trên f và giá trị tương ứng sẽ là 'Test'. Do đó, thực hiện sau này trên hàm f, giá trị 'Test' sẽ là đầu ra cho bàn điều khiển.

0

Prototypes là những gì bạn đang tìm kiếm.

var F = function() { 
    console.log(this.a); 
} 

F.prototype.a = 'Test'; 

// instantiate new Object of class F 
new F(); 

Hy vọng điều này sẽ hữu ích!

+0

cảm ơn, nhưng những gì tôi muốn hỏi là truy cập các thuộc tính của bản thân hàm thay vì các thuộc tính của mẫu thử nghiệm – KwiZ

2

Cách cổ điển để làm điều này là để ràng buộc các chức năng để chính nó, sau đó nó có thể truy cập vào các thuộc tính riêng của mình qua this:

var f = function() { 
 
    console.log(this.a); // USE "THIS" TO ACCESS PROPERTY 
 
}; 
 

 
f.a = 'Test'; 
 
f = f.bind(f);   // BIND TO SELF 
 

 
f();      // WILL LOG 'Test' TO CONSOLE

-1

Bạn có thể thiết lập này bằng cách sử dụng một IIFE :

var f = (function() { 
    function f() { 
    console.log(f.a); 
    } 
    f.a = 'Test'; 
    return f; 
})(); 

f() // logs 'Test' 
f.a === 'Test' // true 

Lưu ý rằng bạn không phải sử dụng f (hoặc thậm chí khai báo chức năng) cho tiện làm việc đúng cách:

var f = (function() { 
    var _f = function() { 
    console.log(_f.a); 
    }; 
    _f.a = 'Test' 
    return _f; 
}); 

f() // logs 'Test' 
f.a === 'Test' // true 

Một số người thích sử dụng cùng một biến khắp nhấn mạnh rằng khu vực nội f cuối cùng sẽ trở thành bên ngoài f, và một số người thích để phân biệt từng phạm vi. Dù bằng cách nào là tốt.

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