Pull to refresh

Comments 23

скажите:
1. const должен работать как let или var?
2. const как свойство класса использовать нельзя, я тикер понимаю
3. Я в этих примерах что-то никогда не видел, есть ли модификатор static?
1. Как let
2. Нельзя
3. Есть, но только для методов и полей класса
1. Замечательно
2. Плохо
3. Замечательно)

Интересно, чисто логически, будет ли корректно работать?

for (let i = 0; i < 5; i++) {
  const x = i * 17;
}


И даже так?

for (const i = 0; i < 5; i++) {

}


Хотя и было сказано:

Не смотря на наши фантазии по этому поводу, намного важней, чтобы вы понимали когда вам действительно необходимо использование константы. Не стоит использовать константы для простых переменных, иначе это может стать причиной недопонимание.


Но я не совсем согласен.
Первый пример разумеется работоспособный, но какого либо преимущества над использованием обычного оператора var нет. Но если вы напишите например такое:
const a = 10;
const a = 11;

То отхватите ошибку дублирования.
Второй же содержит ошибку, так как константа iread-only, и не может быть инкрементирована или деинкрементирована
Вообще в идеологии let, как я понимаю, нету разницы между первым и вторым примером, т.е. let в for распространяется на каждый новый внутренний блок и потому, как я показал в примере ниже — в Хроме на каждой итерации создается своя константа и не блокируется предыдущей read-only. Такой подход сделано, чтобы корректно работал следующий скрипт, который корректно работает в Хроме, и пока некорректно (как var) в Файрфоксе:

(function () {
 'use strict';

 for (let i = 0; i < 5; i++) {
  setTimeout( function () {
    console.log(i);
  }, i );
 }

})();


Думаю, когда в Файрфоксе настроят корректную видимость let (чтобы для каждого вызова он был независим — можно будет в объявлении for использовать const)
В Хроме и Файрфоксе это работает правильно (0, 3, 6, 9, 12)

(function () {

  'use strict';
  
  for (let i = 0; i < 5; i++) {
    const a = i * 3;
    console.log( a );
  }

})()


Следующее в Файрфоксе вызывает «invalid assignment to const i», а в хроме работает корректно с «use strict» и уходит в бесконечный цикл без «use strict»

(function () {

  'use strict';
  
  for (const i = 0; i < 5; i++) {
    console.log( i );
  }

})()
Почему то, мне кажется, что нового создания переменной не происходит, а лишь передача значения (хотя в виде переменной) в scope конкретной итерации.

А с const уходит в бесконечный так как поведение хрома достаточно интересно. Он не бросает каких либо исключений, а просто игнорирует присвоение, инкремент.
Ура, жаваскрипт превращается в приличный язык! Надеюсь, «var» и «function foo()» задепрекейтят в следующей версии
var obj = {
  _x: 42,
  getX: () => this._x
};
console.log(obj.getX());


Что вы ожидаете здесь увидеть в консоли? :)
Ошибку компилятора

Property '_x' does not exist on type 'Item'.
Какой компилятор скажет вам это?

babel на выходе генерирует это
код
"use strict";

var obj = {
  _x: 42,
  getX: function getX() {
    return undefined._x;
  }
};
console.log(obj.getX());


Да я знаю как это работает, просто эйфории по-поводу «стрелки» не понимаю :)
typescript, с натяжкой, но его всё же можно рассматривать как компилятор es6 -> es5
Что вы ожидаете здесь увидеть в консоли? :)

Мне вообще не хотелось бы, чтобы подобные объекты создавались прям в методе
И не должны — это очевидная ошибка. «стрелка» не должна использоваться для определения методов, это всего лишь короткий вариант, который должен использоваться для вызова функций «а-ля функсьональ»
Чесно говоря не разделяю большинства опасений автора касательно оператора let. У большинства ЯП такое-же поведение при использовании переменной до ее объявления или же при использовании переменной, объявленной в шапке for после самого цикла.
То есть в for-let на каждой итерации по лишнему замыканию создаётся?
ну без «let» вам и так нужно будет создать замыкание с помощью вспомогательной функции
Sign up to leave a comment.

Articles