2013-01-23 44 views
6

Tôi có một tấn JavaScript từ buổi bình minh của thời gian với chức năng cuộc gọi được viết như thế này:Patterns JavaScript: Bối cảnh của Chức năng Gọi

THING.someFunction.call(THING); 

Dường như với tôi rằng lúc nào cũng phải tương đương với:

THING.someFunction(); 

Hai cuộc gọi này luôn tương đương? Điều gì về các phiên bản cũ của JavaScript?

Dường như với tôi mục đích của dòng thứ hai THING trong dòng mã đầu tiên đó là đặt bối cảnh (this) bên trong someFunction. Nhưng ngữ cảnh bên trong chức năng đó phải là THING theo mặc định, đúng không?

Chỉ cần được rõ ràng, THING được định nghĩa như thế này:

var THING = function() { 
    // private vars 

    return{ 
     // code 
     someFunction : function() { 
      // code 
     } 
    }; 
}(); 
+2

Cách bạn có mã của bạn ngay bây giờ, 'THING.someFunction' là' undefined'. – gilly3

+1

Tôi tin rằng bạn đang thiếu dấu ngoặc đơn ở cuối THING tuyên bố tức là. THING = function {}(); –

Trả lời

1

Vâng, họ là tương đương. Và tôi không biết bất kỳ phiên bản JavaScript nào mà chúng không (tuy nhiên, call dường như đã được thêm vào trong 1.3).

+1

Tại sao lại là downvote? – Bergi

+0

Cuối cùng tôi nhận ra rằng tôi có thể kiểm tra sự thật của giả thuyết của tôi bằng cách sử dụng Firebug. Bạn nói đúng. Và kể từ khi bạn trả lời đầu tiên, tôi sẽ trao chiến thắng cho bạn. Chúc mừng. – theJollySin

0

Chúng giống nhau về mặt kỹ thuật. Nhưng chúng cũng hoạt động hơi khác nhau trong lập trình không đồng bộ. call() được sử dụng để gọi hàm bằng cách chuyển một phạm vi làm tham số. Điều này cung cấp một cách thuận tiện để gọi các hàm được định nghĩa trong các cuộc gọi lại và thực hiện chậm trễ (setTimeout, setInterval). Nếu bạn đã sử dụng bất kỳ thư viện JS nào, bạn sẽ nhận thấy $ .proxy hoặc _.bind, đây là những bí danh thực hiện cuộc gọi (phạm vi);

Xem this MDN doc để biết thêm thông tin.

+2

Tại sao lại là downvote? Bạn có thể vui lòng chỉ ra những gì đã không chính xác trong những gì tôi đã nêu? Tôi muốn sửa bản thân mình nếu tôi hiểu điều gì đó sai ở ít nhất. – praneetloke

+1

Tôi không downvote, nhưng 'call' không đặt phạm vi. – nnnnnn

+0

Bạn đã đọc tài liệu MDN trong câu trả lời của tôi chưa? Đối số đầu tiên trong cuộc gọi() là 'thisArg' có thể được đặt thành bất kỳ đối tượng nào đại diện cho phạm vi (ngữ cảnh). – praneetloke

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