2012-07-09 26 views
9

Tôi cố gắng để hiểu nếu có bất kỳ sự khác biệt giữa:

(function($){ 

... 

})(jQuery); 

vs

(function($){ 

... 

})($); 

Lưu ý jQuery được thay thế bằng một $. Được không? Nó không được sử dụng ở bất cứ đâu vì nó không thể hoạt động? Nó hoạt động nhưng có thể nó không chuẩn? Ai đó có thể vui lòng giải thích điều này nếu nó là một lỗi hoặc nếu nó là ok? Cảm ơn

+0

Vui lòng kết thúc câu lệnh của bạn bằng dấu chấm phẩy ';'. Nếu không, bạn sẽ gặp rắc rối: '(...) (...) (...) (...)'. –

+1

Điểm thực của mã thứ nhất là có thể sử dụng '$' để tham chiếu jQuery bên trong hàm khi jQuery ở trong [noConflict mode] (http://api.jquery.com/jQuery.noConflict/). Thứ hai sẽ không hoạt động như mong đợi nếu một khung công tác khác đang sử dụng không gian tên '$' trong phạm vi toàn cục. –

Trả lời

15

Các khung JavaScript khác cũng có thể sử dụng $ làm lối tắt. Để đảm bảo rằng $ là jQuery bên trong hàm của bạn, hãy vượt qua jQuery và không phải $ ở cuối. Kiểu định nghĩa một hàm hoặc "vùng mã" là đảm bảo rằng $ thực sự là jQuery khi trộn các khuôn khổ.

1

Có.
$ chỉ là một lối tắt cho jQuery. Nó không định nghĩa lib, do đó nó cũng có thể được sử dụng bởi các framework khác.
Hãy trường hợp này xem xét:

// remove the jQuery shortcut ($ === undefined) 
var j = jQuery.noConflict(); 
// redefine the dollar sign 
window.$ = function(){ 
    // some other plugin 
} 

// case A 
(function($){ 
    alert(jQuery === $);//true 
})(jQuery) 

// case B 
(function($){ 
    alert(jQuery === $);//false 
})($) 
1

ví dụ thứ hai của bạn là không cần thiết. Nếu bạn có thể vượt qua jQuery sử dụng $ sau đó $ đã là jQuery, tức là bạn có thể vừa viết:

(function(){ 
    $('#selectme'); 
})(); 

Ví dụ đầu tiên, chỉ có giá trị nếu bạn muốn sử dụng jQuery trong chế độ noConflict, nhưng vẫn sử dụng $ để tham khảo jQuery trong các phần mã được chọn. Nếu không, bạn về mặt kỹ thuật thậm chí không cần một đóng cửa (mặc dù đóng cửa là thực hành tốt cho nhiều lý do khác).

+0

Ví dụ là KHÔNG thừa. Có thể có một số trường hợp bạn không nên dựa vào phạm vi toàn cầu và sẽ tốt hơn nếu giữ biến mong muốn trong phạm vi chức năng của bạn. Hãy xem xét ví dụ này: '(function() {setTimeout (function() {alert ($ === jQuery);}, 1000);})(); $ = 13;' và sau đó '(hàm ($) {setTimeout (function() {alert ($ === jQuery);}, 1000);}) ($); $ = 13; '. Bạn có thể thấy ví dụ thứ hai cho kết quả mong muốn –

6

Nhiều thư viện JavaScript sử dụng $ làm hàm hoặc tên biến, giống như jQuery. Trong trường hợp của jQuery, $ chỉ là một bí danh cho jQuery, vì vậy tất cả các chức năng có sẵn mà không cần sử dụng $. Nếu chúng ta cần phải sử dụng một thư viện JavaScript cùng với jQuery, chúng ta có thể quay trở lại kiểm soát của $ trở lại thư viện khác với một cuộc gọi đến $ .noConflict():

http://api.jquery.com/jQuery.noConflict/

Trong "no-confict" chế độ, các Phím tắt $ không có sẵn và jQuery còn được sử dụng. Ví dụ:

$(document).ready(function(){ 
    $(#somefunction) ... 
}); 

trở thành:

jQuery(document).ready(function(){ 
    jQuery(#somefunction) ... 
}); 

Để sử dụng jQuery phím tắt mặc định của $, bạn có thể sử dụng các wrapper sau xung quanh mã của bạn:

jQuery(document).ready(function($) { 
    // $() will work as an alias for jQuery() inside of this function 
}); 

Đó wrapper sẽ làm cho mã của bạn được thực hiện khi trang kết thúc tải, và $ sẽ làm việc để gọi jQuery.Nếu vì một lý do nào, bạn muốn mã của bạn để thực hiện ngay lập tức (thay vì chờ cho sự kiện sẵn sàng DOM), sau đó bạn có thể sử dụng phương pháp wrapper này thay vì:

(function($) { 
    // $() will work as an alias for jQuery() inside of this function 
})(jQuery); 

Tốt đọc:http://codex.wordpress.org/Function_Reference/wp_enqueue_script#jQuery_noConflict_wrappers

Hơn nữa nếu bạn quan tâm:

What does $ mean in jQuery?

Điều này sẽ giúp để làm dịu cơn khát của bạn :) có thể hy vọng điều này sẽ hữu ích!

+0

Bạn không cần sử dụng 'document' và' .ready() 'Ưa thích của tôi là:' jQuery ($ => {/ * code * /}) ' – Endless

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