2013-02-02 38 views
16

Từ khóa var trong javascript làm cho một biến được lưu trữ trong phạm vi cục bộ. Nếu không có các biến số var thuộc phạm vi toàn cầu. Điều gì về chức năng? Rõ ràng những gì sẽ xảy ra khi chức năng được khai báo như biếnjavascript phạm vi khai báo hàm

var foo = function() {...} 

nhưng những gì phạm vi không

function foo() {...} 

thuộc về?

EDIT: Tôi nhận ra rằng tôi đã không hỏi khá câu hỏi phù hợp để theo dõi. Trong hầu hết các tổ bên ngoài là có sự khác biệt giữa hai tờ khai trên và khai báo sau đây?

foo = function() {...} 

Trả lời

25

Nó luôn thuộc phạm vi hiện tại. Ví dụ:

// global scope 

// foo is a global function 
function foo() { 

    // bar is local to foo 
    function bar() { 

    } 

} 

Về câu hỏi thứ hai của bạn, điều này:

foo = function() {...} 

là một biểu hiện chức năng ẩn danh được gán cho một biến toàn cầu (trừ khi bạn đang chạy là chế độ nghiêm ngặt, sau đó foo sẽ được undefined) . Sự khác biệt giữa điều đó và function foo() {} là sau là khai báo hàm (so với khai báo biến, được gán một hàm ẩn danh biểu thức).

Bạn có thể quan tâm đến bài viết tuyệt vời này về khai báo hàm và biểu thức hàm: Named function expressions demystified.

+0

Đó là một bài viết tuyệt vời. Cảm ơn. – user1816847

+1

Một sự khác biệt đáng chú ý mà tôi quên đề cập đến là những gì Bergi đã nói trong câu trả lời của mình: các khai báo chức năng được hoisted, vì vậy bạn có thể gọi hàm trước khi nó thực sự xuất hiện trong mã nguồn. – bfavaretto

0

Ví dụ đầu tiên của bạn (var foo = function() {...}) được gọi là chức năng ẩn danh. Nó được khai báo động trong thời gian chạy và không tuân theo các quy tắc giống như một hàm bình thường, nhưng tuân theo các quy tắc của các biến.

+0

thực sự gây nhầm lẫn vì nhiều tài liệu nói những thứ như "hàm là đối tượng lớp đầu tiên" mà không có một cuộc thảo luận nghiêm ngặt hơn về sự khác biệt mà tôi đã đề cập trong OP. – user1816847

7

Tuyên bố chức năng luôn là cục bộ cho phạm vi hiện tại, như biến được khai báo với từ khóa var.

Tuy nhiên, sự khác biệt là nếu họ tuyên bố (thay vì gán cho một biến) định nghĩa của họ là treo, vì vậy họ sẽ có thể sử dụng ở khắp mọi nơi trong phạm vi ngay cả khi tuyên bố đi kèm trong phần cuối của mã. Xem thêm var functionName = function() {} vs function functionName() {}.

3

khác biệt đáng chú ý dùng globals ngầm vào tài khoản:

var foo = function() { 
    // Variables 
    var myVar1 = 42; // Local variable 
     myVar2 = 69; // Implicit global (no 'var') 

    // Functional Expressions 
    var myFn1 = function() { ... } // Local 
     myFn2 = function() { ... } // Implicit global 

    function sayHi() { 
    // I am a function declaration. Always local. 
    } 
} 

Hy vọng rằng làm rõ một chút. Các hình cầu hoàn toàn được xác định nếu bạn quên var trước khi gán. Đó là một mối nguy hiểm nguy hiểm áp dụng cho các khai báo biến và các biểu thức chức năng.

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