2013-03-05 24 views
7

Hoàn toàn hợp lệ để có chức năng javascript làm khóa trong một đối tượng?Có hoàn toàn hợp lệ để có chức năng javascript làm khóa trong một đối tượng không?

Các công trình sau đây, nhưng tôi không chắc chắn nó' s 100% (ECMA hoặc bất cứ cơ thể điều chỉnh việc này) compliant

var f = function(){ 

}; 

var obj = {}; 

obj[f] = "a"; 


console.log(obj[f]); 
+3

Tôi rất tò mò muốn xem trường hợp sử dụng thực tế cho việc này. –

+0

Tôi sẽ nói nó là vô nghĩa. chức năng có thể sử dụng toString để tạo khóa của hàm '["() {...} "]' – mplungjan

+1

theo dõi/hủy đăng ký các chức năng người đăng ký ẩn danh trong một hệ thống/hệ thống phụ. Bạn không chắc chắn đây là cơ sở hạ tầng phù hợp cho công việc mặc dù –

Trả lời

1

zero lý do để làm điều đó, vì phím đối tượng trong ECMAscript có thể chỉ là chuỗi (hiện tại, trong ECMAscript 262 ấn bản 3 và 5, theo thông số kỹ thuật).

Mọi thứ sẽ thay đổi tuy nhiên trong ECMAScript 6, nơi chúng tôi sẽ có WeakMapsphím đối tượng cũng có thể là đối tượng (Tôi không chắc chắn về tài liệu tham khảo chức năng).

Ngay cả khi trình duyệt có thể phân biệt khóa đối tượng theo tham chiếu hàm ngay bây giờ, hành vi đáng ngờ của nó, rất có thể thử nghiệm và không nên sử dụng ngay bây giờ.

7

Có vẻ như nó hoạt động, nhưng nó có thể không hoạt động như bạn mong đợi.

Chức năng được đúc để chuỗi khi được sử dụng như một chìa khóa:

var f = function(a) { return a; }; 
var obj = {}; 
obj[f] = 'abc'; 
console.log(JSON.stringify(obj)); 
//"{"function (a) { return a; }":"abc"}" 
console.log(f.toString()); 
//"function (a) { return a; }" 
var f2 = function (a) { return a; }; 
console.log(obj[f2]); 
//"abc" 

Vì vậy, hàm f và f2 là những đối tượng khác nhau, nhưng họ đều giống nhau khi đúc để chuỗi.

+1

Mặc dù nếu 'f' và' f2' hoạt động giống nhau vì mã cơ bản giống nhau thì nó thường không phải là vấn đề. –

+2

Có thể là nếu chúng bị đóng. Họ có thể có cùng một mã nguồn, có thể được tạo ra bởi cùng một hàm bên ngoài, nhưng chúng sẽ bị ràng buộc với các giá trị khác nhau trong các bao đóng. Vì vậy, họ sẽ ** hành xử ** khác nhau, nhưng trông giống nhau. – SWilk

1
var f = function(){ 

}; 
var obj = {}; 
obj[f] = "a"; 
console.log(obj['function(){\r\n\r\n}']); 
Các vấn đề liên quan