2008-09-22 38 views
41

thể trùng lặp:
JavaScript: var functionName = function() {} vs function functionName() {}Sự khác biệt giữa hai chức năng? ("Chức năng x" vs "var x = function")

sự khác biệt giữa là gì:

function sum(x, y) { 
    return x+y; 
} 

// and 

var sum = function (x, y) { 
    return x+y; 
} 

Tại sao một sử dụng trên cai khac?

+0

không sử dụng chức năng tên, chỉ cần sử dụng chức năng ẩn danh để đóng gói, ngăn ngừa ô nhiễm biến của phạm vi toàn cầu –

Trả lời

48

Đầu tiên được biết đến như một hàm có tên nơi thứ hai được biết đến như một chức năng ẩn danh.

Sự khác biệt thực tế chính là khi bạn có thể sử dụng hàm tổng. Ví dụ: -

var z = sum(2, 3); 
function sum(x, y) { 
    return x+y; 
} 

z được gán 5 trong khi điều này: -

var z = sum(2, 3); 
var sum = function(x, y) { 
    return x+y; 
} 

Sẽ thất bại kể từ khi vào thời điểm đó dòng đầu tiên đã thực hiện tổng biến chưa được gán hàm.

Chức năng được đặt tên được phân tích cú pháp và gán cho tên của chúng trước khi bắt đầu thực hiện, đó là lý do tại sao hàm được đặt tên có thể được thêm vào trong mã đặt trước định nghĩa của nó.

Các biến được chỉ định một hàm theo mã chỉ có thể được sử dụng rõ ràng dưới dạng hàm khi thực thi đã được thực hiện trong quá trình gán.

6

Câu lệnh đầu tiên là câu lệnh hàm được đặt tên, câu lệnh thứ hai gán một biểu thức hàm ẩn danh cho một biến.

Tuyên bố chức năng được thêm vào phạm vi của nó ngay lập tức - bạn không cần phải chạy nó trước khi có thể gọi nó, vì vậy công trình này:

var y = sum(1, 2); 

function sum(x, y) { 
    return x + y; 
} 

Nhưng biểu hiện chức năng chỉ được gán cho biến khi mã được thực thi, vì vậy đây không hoạt động:

// Error here because the function hasn't been assigned to sum yet. 
var y = sum(1, 2); 

var sum = function(x, y) { 
    return x + y; 
} 

Một lợi thế của hình thức biểu hiện là bạn có thể sử dụng nó để gán chức năng khác nhau để biểu hiện ở những điểm khác nhau - vì vậy bạn có thể thay đổi chức năng, hoặc sử dụng một cái khác theo conditi khác tiện ích (chẳng hạn như tùy thuộc vào trình duyệt đang được sử dụng).

Lợi thế của tuyên bố hàm được đặt tên, là trình gỡ lỗi sẽ có thể hiển thị tên. Mặc dù, bạn có thể đặt tên cho các biểu thức hàm:

var sum = function sum(x, y) { 
    return x + y; 
} 

Nhưng điều này có thể gây nhầm lẫn vì hai tên thực sự ở các phạm vi khác nhau và tham chiếu đến các thứ khác nhau.

-5

Chúng có nghĩa là chính xác điều tương tự. Nó chỉ là cú pháp. Thứ hai là IMO tiết lộ nhiều hơn về những gì JavaScript thực sự đang làm; tức là "tổng" chỉ là một biến, khởi tạo với một đối tượng chức năng, mà sau đó có thể được thay thế bằng cái gì khác:

$ js 
js> function sum(x,y) { return x+y; } 
js> sum(1,2); 
3 
js> sum=3 
3 
js> sum(1,2); 
typein:4: TypeError: sum is not a function 
js> sum 
3 
12

Đầu tiên có xu hướng được sử dụng cho một vài lý do:

  1. Cái tên "tổng" xuất hiện trong stacktrace mà làm cho gỡ lỗi dễ dàng hơn trong nhiều trình duyệt.
  2. Tên "tổng hợp" có thể được sử dụng bên trong phần thân chức năng giúp dễ dàng hơn để sử dụng cho các hàm đệ quy.
  3. tuyên bố chức năng được "treo" trong javascript, vì vậy trong trường hợp đầu tiên, chức năng được đảm bảo là được xác định chính xác một lần.
  4. chèn Dấu chấm phẩy gây

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

    gán 4-f.

Có một vài lưu ý cần lưu ý. Không được làm

var sum = function sum(x, y) { ... }; 

trên IE 6 vì nó sẽ tạo ra hai đối tượng hàm được tạo. Đặc biệt là khó hiểu nếu bạn làm

var sum = function mySym(x, y) { ... }; 

Theo tiêu chuẩn, chức năng sum (x, y) {...} không thể xuất hiện bên trong một nếu khối hoặc một thân vòng lặp, vì vậy thông dịch khác nhau sẽ đối xử với

if (0) { 
    function foo() { return 1; } 
    } else { 
    function foo() { return 2; } 
    } 
    return foo(); 

khác nhau. Trong trường hợp này, bạn nên làm

var foo; 
    if (0) { 
    foo = function() { return 1; } 
    } ... 
+0

Điểm tốt về câu lệnh if. Nhưng tôi không nghĩ đúng là hàm được đảm bảo được xác định chính xác một lần. (Hoặc có thể tôi đã hiểu lầm bạn?) –

+0

Tôi không chắc chắn tôi hiểu những gì bạn đang nói ở điểm 4 .. – Kip

+0

Tôi không hiểu chính xác một lần một trong hai tuyên bố hoặc. Các định nghĩa khác nhau của cùng tên hàm có thể có mặt, định nghĩa cuối cùng sẽ thắng. – AnthonyWJones

1

Sự khác biệt là ...

Đây là một chức năng vô danh

var sum = function (x, y) { 
    return x+y; 
} 

Vì vậy, nếu bạn alert (tổng hợp); bạn nhận được "function (x, y) {return x + y;}" (không tên) Trong khi đây là một hàm có tên:

function sum(x, y) { 
     return x+y; 
} 

Nếu bạn alert (tổng hợp); bây giờ bạn nhận được "chức năng tổng (x, y) {return x + y;}" (tên là tổng hợp)

Có tên là chức năng giúp đỡ nếu bạn đang sử dụng một hồ sơ vì các hồ sơ có thể cho bạn biết chức năng tổng 's thời gian thực hiện ... etcetera thay vì thời gian thực hiện một chức năng chưa biết của ... etcetera

0

đây là một ví dụ khác: chức năng sayHello (tên) {alert (' hello' tên +)}

bây giờ, giả sử bạn muốn sửa đổi sự kiện onclick của một nút, chẳng hạn như nó nói "hello world"

bạn không thể viết:

yourBtn.onclik = sayHello ('thế giới'), bởi vì bạn phải cung cấp tham chiếu hàm.

thì bạn có thể sử dụng biểu mẫu thứ hai: yourBtn.onclick = function() {sayHello ('workld'); }

Ps: xin lỗi vì tiếng anh xấu của tôi!

3

Hai đoạn mã bạn đã đăng ở đó sẽ cho hầu như tất cả các mục đích, hoạt động theo cùng một cách.

Tuy nhiên, sự khác biệt về hành vi là với biến thể thứ hai, hàm đó chỉ có thể được gọi sau điểm đó trong mã.

Với biến thể đầu tiên, hàm có sẵn cho mã chạy ở trên nơi hàm được khai báo.

Điều này là do với biến thể thứ hai, hàm được gán cho biến foo tại thời gian chạy. Trong lần đầu tiên, hàm được gán cho số nhận dạng đó ở thời gian phân tích cú pháp.

thông tin kỹ thuật hơn

Javascript có ba cách xác định các chức năng.

  1. Ví dụ đầu tiên của bạn là khai báo chức năng . Điều này sử dụng tuyên bố "" chức năng " để tạo một hàm. Hàm này có sẵn ở thời gian phân tích cú pháp và có thể được gọi ở bất kỳ đâu trong phạm vi đó. Bạn vẫn có thể lưu trữ nó trong một thuộc tính biến hoặc đối tượng sau này.
  2. Đoạn thứ hai của bạn hiển thị biểu thức hàm . Điều này liên quan đến việc sử dụng toán tử "" chức năng " để tạo một hàm - kết quả của toán tử đó có thể được lưu trữ trong bất kỳ thuộc tính biến hoặc đối tượng nào. Biểu thức hàm là mạnh mẽ theo cách đó. Biểu thức hàm thường được gọi là "hàm ẩn danh" vì nó không phải có tên,
  3. Cách thứ ba để xác định hàm là hàm tạo "Function()", không được hiển thị trong bài đăng gốc của bạn . Không nên sử dụng nó vì nó hoạt động giống như eval(), có vấn đề.
Các vấn đề liên quan