2012-10-26 53 views
19

tôi đang tìm kiếm tại đầu ra của một số công cụ từ UglifyJS và xảy ra trên một số mã như sau:Tại sao JavaScript này hoạt động?

var a = 0; 
var b = function() { 
    return function() { 
     a++; 
    }(), 'Hello, World' 
}(); 

Sau khi chạy mã a1b là chuỗi Hello, World!.

Thoạt nhìn, có vẻ như b sẽ là undefined vì có vẻ như kết quả của hàm không có giá trị trả về được trả về, nhưng sau đó là dấu phẩy và chuỗi ký tự.

Tại sao tính năng này hoạt động?
Và tại sao UglifyJS chỉ thực hiện chức năng ẩn danh và sau đó trả lại Hello, World! làm tuyên bố tiếp theo?

+5

Câu hỏi hay hơn có thể là lý do tại sao bạn (hoặc bất kỳ ai) viết javascript theo cách này? Mã nên rõ ràng. –

+5

@CoreyOgburn nó không rõ ràng nếu bạn biết những gì các nhà điều hành dấu phẩy làm. – AD7six

+0

'var a = (" rofl "," nhưng lol của nó! "); ' – jAndy

Trả lời

25

Nó hoạt động do toán tử dấu phẩy. Từ thông số MDN:

Toán tử dấu phẩy đánh giá cả toán hạng thứ hai (từ trái sang phải) và trả về giá trị của toán hạng thứ hai.

Cả hai chức năng đều là IFFY, chúng được thực thi ngay lập tức.

+1

IFFIs là gì? – j08691

+4

@ j08691: Tôi nghĩ anh ấy có nghĩa là "IIFE" hoặc "Biểu thức chức năng được gọi ngay lập tức". Đó là khi bạn thực hiện một hàm và ngay lập tức gọi nó, như 'function() {}()'. Tuy nhiên, không phải tất cả các chức năng * đều là "IIFE". –

+3

@Rocket, tôi đoán Wouter có nghĩa là * cả hai * chức năng trên mã ví dụ là IIFE. – bfavaretto

6

Kết quả của biểu thức sử dụng the comma operator là phía bên tay phải của toán tử dấu phẩy.

Bạn có:

return a_function_call(), a_string 

... để bạn có được a_string giao.

4

Trước hết hãy để tôi trích dẫn MDN on the comma operator:

Nhà điều hành dấu phẩy đánh giá cả hai toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng thứ hai.

Với điều đó đang được nói, rõ ràng, làm thế nào mã của bạn đánh giá:

Bên trong chức năng ngay lập tức thực hiện bạn quay trở lại 2 giá trị cách nhau bởi dấu phẩy:

function() { a++; }() 

'Hello World' 

Vì vậy, cả hai toán hạng đều được đánh giá. Đây increments biến của bạn a và dẫn đến các biểu thức sau đây cho giá trị trả về của hàm để tạo b:

undefined, 'Hello World' 

Cuối cùng toán hạng phải được trả về như một giá trị cho chức năng bên ngoài, do đó đem lại b giá trị 'Hello World'.

+0

Sẽ không 'trả về một ++, 'Hello World';' là giống nhau không? Tôi không nghĩ rằng 'hàm()' là cần thiết. –

+1

@RocketHazmat Chắc chắn nó không cần thiết ở đây, nhưng nó có mặt trong mã của OP. – Sirko

0

Khám phá comma operator in JavaScript.

Toán tử dấu phẩy đánh giá cả hai toán hạng của nó (từ trái sang phải) và trả về giá trị của toán hạng thứ hai.

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