2012-01-15 34 views
5

Tôi đã gần đây duyệt js mã và cú pháp sau tiếp tục trở lên:Mục đích của var a = TC = function() {} cú pháp

var foo = bar.bi = function() {...} 

Đây là cú pháp quen thuộc đối với tôi. Là nó chỉ để xác định hai tên cho cùng một chức năng? Nếu vậy, tại sao không chỉ xác định nó là bar.bi = function()?

Trả lời

6

Gán cùng một giá trị cho biến và thuộc tính bi của đối tượng bar cùng một lúc.

Cách này thuộc tính của đối tượng nhận được giá trị, nhưng bạn vẫn có thể tham chiếu nó dưới dạng biến, có khả năng nhanh hơn một chút.

có hiệu quả giống như ...

bar.bi = function() {...}; 
var foo = bar.bi; 

foo === bar.bi; // true 

Hoặc bạn có thể hình dung nó như ...

var foo = (bar.bi = function() {...}); 

Vì vậy, việc chuyển nhượng để bar.bi xảy ra đầu tiên. Kết quả trả về từ biểu thức gán là cùng một hàm, và kết quả đó được gán cho foo.

+1

+1 - Bạn đánh bại tôi :) –

1

Ngoài việc gán hàm cho 2 biến, ngữ cảnh cũng thay đổi tùy thuộc vào cách bạn gọi nó.

bar.bi(); 

sẽ có nó là bối cảnh như đối tượng bar, như thể bạn đã có thể sử dụng này:

foo.call(bar); 

Nhưng sử dụng nó ra khỏi biến khác, như thế này:

foo(); 

sẽ sử dụng ngữ cảnh của foo. Vì vậy, nếu foo là trong bối cảnh toàn cầu, nó sẽ tương đương như sau:

bar.bi.call(window); 
+0

Điểm thú vị, hành vi này thường được sử dụng? – Fdr

+0

@Fdr - Tôi không biết. Tôi đã không thực sự nhìn thấy nó trong hành động bao giờ hết, nhưng nó là tốt để biết. –

1

Nó chỉ là một nhiệm vụ phức hợp

var r = x = 3; 

gán 3 đến x, và cũng để r, mà mới được công bố .

Ví dụ của bạn chỉ thay thế một hàm thay cho 3 và thuộc tính đối tượng— bar.bi —tại địa điểm x.

0

Nó phụ thuộc vào nơi nó được sử dụng.

Cả hai foobar.bi trỏ đến cùng chức năng tại đây. Điều đó có nghĩa các chức năng có thể được gọi bằng

foo(); 

bar.bi(); 

Đồng thời nó khác ở chỗ giá trị của this bên trong hàm.Để thực hiện đầu tiên bằng một thứ hai, nó nên được gọi như đưa ra dưới đây

foo.call(bar); 

hoặc

foo.apply(bar); 

này đảm bảo rằng this sẽ trỏ đến bar bên trong hàm.

vui lòng tham khảo:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/call.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function/apply.

.

0
var foo = bar.bi = function() {...}; 



bar.bi === function() {...} //true 

foo === bar.bi //true 

thanh sẽ là đối tượng phản hồi phương pháp bi.

+0

Tôi nghĩ bạn sẽ thấy rằng hai lần so sánh '===' đầu tiên của bạn sẽ là '// false' bởi vì bạn đang so sánh hai đối tượng hàm khác nhau. Cuối cùng của bạn là tất nhiên chính xác mặc dù. –

+1

Có. Bạn đúng rồi. Cảm ơn. – riship89

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