2015-02-05 18 views
9

Tôi đang chơi xung quanh với một số logic vô nghĩa để hiểu rõ hơn ES6 và đã nhận thấy một sự xuất hiện kỳ ​​lạ khi xác định một hằng số.ES6 tại sao tôi có thể gán lại một hằng số khi được xác định trong một vòng lặp

Dường như có thể thay đổi một nhiệm vụ thường xuyên khi định nghĩa trong một vòng lặp:

 "use strict"; 

     for(const i=0;i<10;i++){ //seting constant in loop 
      console.log(i); //is reassigned and incremented 0,1,2,3... 
     } 


     const e = 0; //setting constant outside loop 
     for(;e<10;e++){ //cannot reassign constant 
      console.log(e); 
     } 

là hành vi mong đợi này và ai cũng có thể làm sáng tỏ về lý do tại sao điều này xảy ra, là lời tuyên bố trong vòng lặp khác nhau?

enter image description here


Update từ Statements/const

This declaration creates a constant that can be global or local to the function in which it is declared. Constants are block-scoped.

+1

Chà, chỉ cần thử trên phiên bản Chrome 40.0.2214.94 và nó tạo ra một vòng lặp vô hạn, có thể vì hằng số không bao giờ bị tắt tiếng. Trình duyệt mà bạn đang sử dụng? – Sarcadass

+0

Điều đó có nghĩa là có nghĩa là Chrome đã sửa nó bằng cách không gán lại nó (? Nhưng có lẽ nên ném một lỗi) và vẫn giữ nguyên hằng số. Trong trường hợp của bạn, có vẻ như 'const' hoạt động như' let' https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#let_in_loops –

+0

Trong Firefox, tôi nhận được 'TypeError: redeclaration của var i' cho ví dụ đầu tiên – Kapep

Trả lời

8

Khi bạn sửa đổi một "bất biến ràng buộc", các current draft chỉ ném trong chế độ nghiêm ngặt:

Như @kangax chỉ ra, chỉ định lại một hằng số nên luôn luôn ném, kể từ const tạo ra một "bất biến ràng buộc" với strict cờ trên (here):

If IsConstantDeclaration of d is true, then

Call env’s CreateImmutableBinding concrete method passing dn and true as the arguments.

then:

SetMutableBinding (N,V,S) ...

  1. Else if the binding for N in envRec is a mutable binding, change its bound value to V.
  2. Else this must be an attempt to change the value of an immutable binding so if S is true throw a TypeError exception.

Tuy nhiên, nút chỉ ném trong chế độ nghiêm ngặt:

"use strict"; 

const e = 0; 
e = 42; // SyntaxError: Assignment to constant variable. 

(không rõ tại sao đây là "SyntaxError") ...

Trong chế độ không nghiêm ngặt, đề bài về nhà thường xuyên được âm thầm bỏ qua:

const e = 0; 
e = 42; 
console.log(e); // 0 

Thử nghiệm với nút v0.10.35 với --harmony cờ.

+0

Điều này trông giống như một lỗi trong Nút. Hoặc nó không được thực hiện. Việc gán lại cho 'const' chắc chắn sẽ ném, bất kể chế độ. Nếu bạn nhìn vào https://people.mozilla.org/~jorendorff/es6-draft.html#sec-for-statement-runtime-semantics-labelledevaluation bạn sẽ thấy rằng 'const' kết quả trong' CreateImmutableBinding' với S = đúng, vì vậy nó là một TypeError ngay khi vòng lặp bắt đầu lặp lại thứ 2. – kangax

+2

Bạn cũng có thể xem bảng phân tích hỗ trợ chính xác trong bảng compat của chúng tôi - https://kangax.github.io/compat-table/es6/#const - trong đó cho thấy rằng "xác định lại một const là một lỗi" trong thực tế là thiếu trong Chrome tại thời điểm (đó là những gì OP đang trải qua, tôi đoán) – kangax

+0

@kangax: cảm ơn vì đã chỉ ra rằng, đã chỉnh sửa. – georg

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