2009-08-27 26 views
5

JavaScript bên dưới có ý nghĩa gì? Tại sao hàm được nhúng bên trong()?Cú pháp JavaScript lạ như sau: (function() {// code})() ;?

(function() { 
    var b = 3; 
    a += b; 
})(); 
+0

Cảm ơn bạn. Bây giờ tôi không chắc chắn câu trả lời để chấp nhận như tất cả đều rất tốt. – Jeff

+1

Justin cung cấp một ví dụ ... trong cuốn sách của tôi, thắng :) – Sampson

Trả lời

13

Nó có chức năng tương đương với việc làm một cái gì đó như:

var myFunc = function(){ 
    var b = 3; 
    a += b; 
}; 

myFunc(); 

Nó có dấu ngoặc đơn xung quanh nó (và dấu) để hàm được gọi ngay lập tức. Như những người khác đã nói, khái niệm này được gọi là hàm số vô danh .

+3

Nó không chỉ là một cách khác. Cách của bạn sẽ tạo một biến 'myFunc', có thể hoặc không thể va chạm với các biến hiện có khác. Mã được đăng bởi OP không tạo biến này. Nó vẫn còn vô danh của khóa học. Nhưng giá trị được gắn với một biến, không có trong mã OP. – Svend

+2

Tôi đã không có nghĩa là hai là chính xác tương đương ... chỉ functionaly. Họ sẽ sản xuất cùng một kết quả cuối cùng. –

5

Đây là một chức năng ẩn danh, chỉ kích hoạt sau khi tạo.

4

Chức năng ẩn danh của nó.

Chức năng ẩn danh là các hàm được khai báo động tại thời gian chạy không cần phải có tên.

Chức năng ẩn danh được khai báo sử dụng toán tử hàm. Bạn có thể sử dụng toán tử hàm để tạo hàm mới ở bất cứ đâu hợp lệ để đặt biểu thức . Ví dụ: bạn có thể khai báo hàm mới làm thông số cho một cuộc gọi hàm hoặc gán một thuộc tính của một đối tượng khác.

Để đọc thêm

Javascript anonymous functions

chức năng Anonymous có thể giúp làm cho mã ngắn gọn hơn khi định nghĩa một hàm đó sẽ chỉ được sử dụng ở một nơi. Thay vì phải khai báo chức năng và sau đó sử dụng nó, bạn có thể thực hiện cả hai trong một bước. Đặc biệt là hữu ích cho những việc như tuyên bố sự kiện trình xử lý và gán phương thức cho các đối tượng .

Ví dụ, nếu chúng ta tạo hàm khởi tạo, chúng ta cần khai báo các phương thức của đối tượng và gán chúng cho các thuộc tính của đối tượng để chúng có thể được gọi bên ngoài đối tượng. Có thể khai báo hàm và sau đó gán nó vào một biến như là một bước riêng biệt như thế này:

function Pet(name, species, hello) 
{  
      this.name = name;  
      this.species = species;  
      this.hello = hello; 

      function sayHello()  
      {  
       alert(this.hello);  
      } 

      this.sayHello = sayHello;  
     } 

Nhưng đó là một chút thuận tiện hơn và súc tích để làm điều đó tất cả như một bước:

function Pet2(name, species, hello) 
{ 
     this.name = name;  
     this.species = species;  
     this.hello = hello; 

     this.sayHello = function()  
     {  
      alert(this.hello);  
     }  
    } 
+0

đừng quên lý do để đặt một hàm ẩn danh bên trong dấu ngoặc đơn, mặc dù ... có thể đã quá muộn, vì nó đã được che phủ khá tốt rồi. – peirix

2

Điều bạn viết là một hàm ẩn danh được gọi ngay lập tức. Lý do để làm điều đó là sử dụng các biến riêng. Nếu thay vì mã của bạn, sẽ có:

var b = 3; 
a += b; 

b sẽ là biến toàn cục. Vì vậy, nếu bạn cần trong biến toàn cầu mã riêng, đó là cách để làm điều này.

1

Đây là chức năng ẩn danh được thực thi tại chỗ.Cách sử dụng tốt nhất của điều này là thiết lập một số bối cảnh hoặc môi trường cài đặt hoặc có một số tác dụng phụ khi tải.

Điều này được sử dụng rất nhiều bởi các bộ công cụ Ajax như JQuery, Dojo, v.v. để thực hiện phép thuật thời gian tải và giải quyết nhiều khó khăn và thiếu sót của trình duyệt.

1

Đó là một chức năng ẩn danh, được gọi trực tiếp sau khi tạo, sau đó bị vứt bỏ.

Đó là bên trong dấu ngoặc đơn để ngăn lỗi cú pháp. Nếu không có dấu ngoặc đơn, từ khóa function cần được theo sau bởi một số nhận dạng.

Bạn cũng có thể làm như thế này để đưa các chức năng trong một biến, và sau đó gọi nó là:

var x = function() { 
    var b = 3; 
    a += b; 
} 
x(); 

Chú ý rằng các dấu ngoặc đơn không cần thiết khi từ khóa function không phải là đầu tiên.

1

Chức năng trong javascript là các đối tượng và cũng có thể được sử dụng làm đối tượng. Vì vậy, ví dụ bạn có thể làm điều này:

var a = function() {alert("done");}; 
a(); 

này thường được sử dụng trong các chức năng khác nhau mà bạn phải vượt qua một số logic bên trong. Ví dụ như "loại" chức năng đối với mảng hy vọng một đối tượng chức năng để được chuyển vào bên trong để xác định làm thế nào để sắp xếp các mảng:

var a = [{id: 15, name: 'test'}, 
     {id: 11, name: 'asd'}, 
     {id: 88, name: 'qweqwe'}]; 
a.sort(function(a,b) { 
    if (a.id > b.id) return 1; //Put a after b 
    if (a.id < b.id) return -1; //Put a before b 
    if (a.id == b.id) return 0; //Don't make no changes 
}); 

Phương pháp 'sắp xếp' sau đó gọi hàm được cung cấp với tất cả các loại phần tử mảng để sắp xếp nó.

Ví dụ của bạn là gì - nó tạo ra một đối tượng hàm và chỉ chạy ngay lập tức nó.

1

Câu trả lời của Justin giải thích nó khá tốt, nhưng tôi nghĩ tôi chỉ cần thêm rằng tập đầu tiên của dấu ngoặc đơn (mở trước function) thực sự là không cần thiết cho đến khi thực hiện chương trình. Để dễ đọc, tuy nhiên, nó rất quan trọng! Khi tôi thấy điều này:

(function() { 

tôi biết rằng chức năng này đang được gọi là ngay lập tức, mà không cần phải cuộn xuống để tìm sự kết thúc của khối. Điều này quan trọng bởi vì đôi khi bạn muốn gán giá trị trả về của hàm cho một biến và đôi khi bạn muốn gán hàm cho một biến. Xem:

var x = (function() { 
    return 4; 
})(); 

var y = function() { 
    return 4; 
}; 

// typeof x == integer (4) 
// typeof y == function 
Các vấn đề liên quan