2015-06-08 25 views
5
  1. khối phạm vi đôi khi giống như chức năng phạm vi? Tôi biết phạm vi chức năng là dành cho mọi thứ bên trong một hàm, nhưng không nhận được chính xác phạm vi khối là gì.
  2. Đối với Javascript, có phải là hiện tại được khuyến nghị sử dụng let/const thay vì var để bảo trì trong tương lai không? (Đây là từ Airbnb Style Guide)

Trả lời

2

Tôi không chắc chắn bạn thực sự bị câu hỏi của bạn đã trả lời được nêu ra:

là chặn phạm vi đôi khi giống như phạm vi chức năng? Tôi biết phạm vi chức năng là cho tất cả mọi thứ bên trong một chức năng, nhưng không nhận được những gì chính xác một phạm vi khối là.

, phạm vi khối đôi khi giống với phạm vi chức năng. Phạm vi khối là tất cả mọi thứ bên trong một bộ niềng răng { a block scope here }. Vì vậy, ở phía trên cùng của mã của một chức năng, một phạm vi khối sẽ được giống như một phạm vi chức năng:

function test(x) { 
    // this is both a block scope and a function scope 
    let y = 5; 
    if (x) { 
     // this is a smaller block scope that is not the same as the function scope 
     let z = 1; 
    } 
} 

Đối với Javascript, là nó hiện đang khuyến khích sử dụng để/const thay của var để bảo trì trong tương lai ? (Đây là từ Airbnb Style Guide)

letconst là một phần của đặc tả ES6 mới nhất và chỉ được thực hiện trong các công cụ mới nhất javascript và đôi khi trong các công cụ mới nhất họ chỉ kích hoạt với cờ đặc biệt. Họ đang đến với tất cả các công cụ/trình duyệt JS mới hơn, nhưng chưa được triển khai rộng rãi. Do đó, nếu bạn đang viết Javascript để sử dụng trình duyệt thông thường trên internet rộng, bạn không thể sử dụng một cách đáng tin cậy letconst.

Có một số trường hợp bạn một cách an toàn có thể lập trình với letconst bây giờ:

  1. Nếu bạn đang nhắm mục tiêu chỉ có một động cơ Javascript cụ thể và bạn biết rằng nó có hỗ trợ cho những tính năng (ví dụ như một cụ thể phiên bản của nodejs hoặc một plug-in chỉ cho một phiên bản cụ thể của một trình duyệt cụ thể).

  2. Nếu bạn đang sử dụng trình thu thập thông tin sẽ chuyển đổi mã của bạn thành mã sẽ chạy trong tất cả các trình duyệt. Khi sử dụng trình chuyển đổi, bạn có thể viết mã bằng các tính năng mới nhất và trình thu thập thông tin sẽ "tắt tiếng" để mã của bạn hoạt động trong các trình duyệt cũ hơn bằng cách sử dụng các mô phỏng các tính năng mới hơn.

Nếu bạn đang lập trình cho một môi trường mà bạn biết rằng letconst được hỗ trợ, sau đó nó được khuyến khích sử dụng chúng cho phù hợp. Nếu bạn khai báo một biến ở trên cùng của hàm, thì letvar sẽ thực hiện tương tự.

Nếu bạn khai báo biến trong phạm vi nhỏ hơn trong hàm, thì let sẽ được chứa trong phạm vi nhỏ hơn, nhưng var sẽ được đưa lên đầu hàm và sẽ có phạm vi chức năng, bất kể nó được khai báo ở đâu .


Các AirBnb Style Guide bạn liên kết với được viết riêng cho một môi trường ES6 (lưu ý có một liên kết riêng biệt cho một phiên bản ES5 của hướng dẫn phong cách của họ). Vì vậy, điều đó có nghĩa rằng họ đang giả định một môi trường có khả năng ES6. Đó là vì họ đang nhắm mục tiêu một công cụ JS phía máy chủ mà họ biết hỗ trợ ES6 hoặc vì họ đang sử dụng trình chuyển đổi sẽ chuyển đổi mã ES6 thành mã nào đó sẽ chạy trên một công cụ ES5.


Lưu ý về transpilers. Trước khi sử dụng transpiler và chuyển tất cả các khai báo biến thành let trong phạm vi khối, cần hiểu loại mã nào mà trình tạo ra mã và tạo mã bổ sung có ảnh hưởng đến hiệu suất của ứng dụng của bạn hay không.Ví dụ, phạm vi khối cho let được mô phỏng bằng cách tạo một IIFE nội tuyến có thể dẫn đến thêm chi phí thời gian chạy cho mỗi khối có chứa câu lệnh let. Tôi không nói điều này nhất thiết phải là một điều xấu nên tránh cho bạn sử dụng trình chuyển đổi, nhưng khi quyết định có sử dụng trình chuyển đổi hay không, tôi khuyên bạn nên tự làm quen với mã chuyển đổi giống như thế nào cho nhiều ES6 các tính năng để bạn biết liệu đó có phải là công cụ thích hợp cho bất kỳ công việc nào bạn có hoặc chỉ cho một số công việc.

7
  1. javascript 5 không sử dụng phạm vi bị chặn mà nó sử dụng phạm vi chuỗi. sự khác biệt chính là bạn không thể truy cập biến bên ngoài phạm vi trừ khi bạn làm cho nó toàn cầu. ES 6 sẽ có phạm vi bị chặn khi bạn khai báo một biến với let.
  2. hiện được khuyến nghị sử dụng var vì ES 6 không được hỗ trợ đầy đủ.
+0

Có ngày dự kiến ​​phát hành ES6 không? Tôi tự hỏi tại sao Airbnb đề nghị chúng tôi sử dụng tiêu chuẩn ES6 này sớm. – chenghuayang

+1

@ChenghuaYang: Đã có ngày phát hành ước tính cho đặc điểm kỹ thuật ES6 * trong một vài năm tới, tôi nghĩ tại một thời điểm nó được thực hiện trong năm 2012 hoặc 2013. Cuối cùng tôi nghe nói, có, họ đang mong đợi nó Năm nay. Nhưng sau đó tất nhiên, bạn phải chờ đợi cho các nhà cung cấp để hỗ trợ nó, và cho mọi người để nâng cấp trình duyệt của họ. Đối với Airbnb, tốt, có lẽ họ đang transpiling, hoặc có thể họ chỉ đẩy một chương trình nghị sự. Các đội –

+1

@ChenghuaYang Airbnb đã được viết bằng ES6, nhưng họ sử dụng trình chuyển đổi (như [Traceur] (https://github.com/google/traceur-compiler) hoặc [Babel] (http://babeljs.io/)) thành transpile thành ES5 để mã của chúng có thể được sử dụng trong các trình duyệt hiện nay. – laruiss

3

Phạm vi khối có đôi khi giống với phạm vi chức năng không? Tôi biết phạm vi chức năng là cho tất cả mọi thứ bên trong một hàm, nhưng không nhận được chính xác phạm vi khối là gì.

Khối phạm vi là tất cả mọi thứ ở bên một khối , ví dụ .:

function foo() { 
    // function scope 
    if (condition) { 
     // block scope 
    } 
} 

Up qua phiên bản đặc tả thứ 5, JavaScript không có phạm vi khối. Thông số tiếp theo (ECMAScript 6, hay còn gọi là "ES6"), rất gần hoàn tất, thêm phạm vi khối qua letconst.

Đối với Javascript, hiện tại bạn có nên sử dụng let/const thay vì var để bảo trì trong tương lai không?

Điều đó hoàn toàn tùy thuộc vào bạn. letconst là các công cụ mới mà bạn có thể thêm vào dây đai của mình. Họ không để thay thế var nếu bạn không muốn. Điều đó nói rằng, bạn nghe "let là mới var" rất nhiều.

Các biến được khai báo với let có phạm vi chặn, các biến được khai báo với var thì không.

Lưu ý rằng letconstdon't have great support in the wild yet. Không có bất ngờ lớn, thêm phạm vi khối cho một động cơ mà không bao giờ có nó trước khi được cho là không tầm thường. Bạn có thể sử dụng trình phát transpiler như Babel hoặc chỉ sử dụng var ngay bây giờ.

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