2012-02-13 84 views
8

Xin lỗi vì đã đăng chức năng này nhưng chức năng này không có khả năng google và tôi không tìm thấy nó trong mã JavaScript của mình.chức năng trong Javascript nghĩa là gì?

Sau đây là cách Twitter sử dụng nó:

<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://google.com" data-text="Google says">Tweet</a> 
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs");</script> 

từ https://twitter.com/about/resources/buttons#

Trả lời

21

Đó là ngắn tay hoặc thay thế self-invoking anonymous function:

(function(){ 
    // code 
})(); 

có thể được viết:

!function(){ 
    // code 
}(); 

Bạn cũng có thể sử dụng + thay vì !.

Nếu bạn chỉ đơn giản là đã làm:

function(){ 
    // code 
}(); 

Điều đó sẽ tạo ra vấn đề, đó là lý do tại sao bạn cần phải thêm ! trước khi nó mà biến chức năng khai vào chức năng biểu hiện.

Quoting docs, section 12.4:

An ExpressionStatement cannot start with the function keyword because that might make it ambiguous with a FunctionDeclaration.

Để hiểu rõ hơn về khái niệm, bạn nên kiểm tra:

+0

Thú vị. Khi nào một hàm ẩn danh tự gọi là hữu ích? Nó khác với việc thực hiện các câu lệnh bên trong như thế nào? – netvope

+1

@netvope: Xem http://stackoverflow.com/questions/592396/what-is-the-purpose-of-a-self-executing-function-in-javascript – Sarfraz

+0

Tôi hiểu. Cảm ơn. Sẽ được tốt đẹp nếu Javascript hỗ trợ phạm vi chỉ với niềng răng (như trong C + +) – netvope

2

họ đang phủ nhận kết quả, không phải là chức năng riêng của mình:

!function(x){ return x }(true); 
!true 
false 

Trên thực tế, đó là một hơi nén của:

(function(){}()) 

vì nó yêu cầu ít ký tự hơn. Lý do cần thiết là bạn không thể gọi trực tiếp khai báo hàm, ví dụ: đây là không hợp lệ:

function(){}() 

nhưng thêm ! lúc đầu biến nó thành một chức năng expression và làm cho nó hoạt động.

+0

Kỹ thuật thú vị ... –

+1

"phủ nhận kết quả" là gây hiểu nhầm, @ Câu trả lời của Twisol chính xác hơn –

+0

@ ŠimeVidas - Tôi có cảm giác đây là mã được tạo để tìm kiếm các mẫu chức năng tự gọi vì nó lưu 1 ký tự :) –

2

Nó thường được sử dụng để làm việc xung quanh một đứa trong cú pháp JavaScript. Điều này đưa ra một lỗi cú pháp:

function() { 
}(); 

Nó được gọi là khai báo hàm (như function foo() {}), chứ không phải là một biểu thức hàm. Vì vậy, thêm! trước khi nó, hoặc gói nó trong dấu ngoặc đơn, buộc trình phân tích cú pháp hiểu rằng đó là một biểu thức.

+0

Nó không phải là một cú pháp của cú pháp. Nó chỉ là cú pháp. –

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