2010-09-24 25 views

Trả lời

5

Ví dụ đầu tiên mà bạn nghĩ đến là: Việc xử lý JavaScript closures sẽ đắt hơn nhiều nếu được triển khai với phạm vi cấp khối.

Khi bạn nhập một hàm trong JavaScript, một đối tượng được phân bổ (tốt, một cặp vợ chồng, nhưng chúng tôi sẽ tập trung vào một) kết thúc là đối tượng "biến"   — có nghĩa là, tất cả các đối số và địa phương các vars cho cuộc gọi hàm đó được giữ (như các thuộc tính). Đó là đối tượng mà việc đóng cửa thực sự sử dụng (không chỉ là "các biểu tượng" nó xuất hiện để sử dụng; đó là một quan niệm sai lầm phổ biến). Các đối tượng này được xâu thành chuỗi trong một chuỗi, được gọi là chuỗi phạm vi , được sử dụng để giải quyết các biểu tượng không đủ tiêu chuẩn.

Hãy tưởng tượng sẽ tốn kém bao nhiêu nếu mỗi khối giới thiệu phạm vi mới.

+1

Ý của bạn là nếu được triển khai với phạm vi cấp ** khối **. –

+0

@Peter: Crikey, bây giờ có một phiếu của các ngón tay ... Cảm ơn! –

-1

Không có gì bạn không thể làm - không khó để mô phỏng phạm vi cấp chức năng với phạm vi cấp khối hoặc ngược lại.

tờ khai chức năng Conditional sẽ lúng túng hơn mặc dù:

if (console && console.log) { 
    function debug(msg) { console.log(msg); } 
} else { 
    function debug(msg) { alert(msg); } 
} 
debug('foo'); // does not work with block scope 
+3

Điều đó thực sự chưa bao giờ được tiêu chuẩn hóa, nó sẽ hoạt động * chỉ * trong triển khai Mozilla, bởi vì chúng xác định một Tuyên bố hàm, điều không tồn tại trên đặc tả ECMAScript. Các triển khai khác sẽ chỉ đơn giản là lấy 'FunctionDeclaration' cuối cùng mặc dù mã * nên * gây ra một' SyntaxError' vì không có sản xuất ngữ pháp nào có thể chấp nhận các khối bên trong của FD. – CMS

+2

@CMS: Thật vậy. Tgr: Bạn nên sử dụng các biểu thức hàm để gán các hàm có điều kiện. Xem http://kangax.github.com/nfe/#expr-vs-decl –

+1

@CMS: * "... bởi vì không có sản xuất ngữ pháp nào có thể chấp nhận các khối bên trong của FD." * Wow, phần đó tôi không biết. Tôi biết rằng 'FunctionDeclaration' sẽ được xử lý bất kể nó ở đâu trong hàm (ví dụ:, không có điều kiện), nhưng tôi đã không nhận ra rằng ngữ pháp không hỗ trợ nó. Như bạn chỉ ra, ý tưởng xấu bất kể, tất nhiên. Như Marcel nói, sử dụng một biểu thức chức năng (và như là liên kết tuyệt vời của Marcel để bài viết của kangax chỉ ra, trừ khi bạn muốn [vấn đề IE/JScript] (http://blog.niftysnippets.org/2010/09/double-take.html) , một ẩn danh). –

3

Tôi muốn xem các ví dụ của việc sử dụng phạm vi chức năng cấp đó sẽ là khó hoặc không thể thực hiện sử dụng phạm vi khối cấp.

Có lẽ nó sẽ âm thanh rõ ràng, nhưng bạn có thể thực hiện đệ quy trong phạm vi chức năng cấp, có thể là thường hữu ích, ví dụ:

var x = 5; // global scope 

(function (y) { // y - locally scoped variable on each execution 
    y && arguments.callee(--y); // recursion! 
    console.log(y); 
})(x); 

Đó là chủ yếu không thể thực hiện với phạm vi khối cấp . Trong ví dụ trên, chức năng ban đầu sẽ được thực thi thông qua giá trị của biến số x bên ngoài, trước khi hàm được gọi một bối cảnh thực thi mới được thiết lập, khởi tạo một phạm vi từ vựng mới, trong đó tham số chính thức y ràng buộc với nó.

Sau đó, biểu thức chức năng được thực hiện lại -if y không phải là 0 - khởi tạo trên mỗi thực thi một phạm vi từ vựng hoàn toàn mới.

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