book Eloquent_JavaScript
Category Archives: JavaScript
Современный стандарт, “use strict”
Современный стандарт, “use strict”
Очень долго язык JavaScript развивался без потери совместимости. Новые возможности добавлялись в язык, но старые – никогда не менялись, чтобы не «сломать» уже существующие HTML/JS-страницы с их использованием.
Однако, это привело к тому, что любая ошибка в дизайне языка становилась «вмороженной» в него навсегда.
Так было до появления стандарта ECMAScript 5 (ES5), который одновременно добавил новые возможности и внёс в язык ряд исправлений, которые могут привести к тому, что старый код, который был написан до его появления, перестанет работать.
Чтобы этого не случилось, решили, что по умолчанию эти опасные изменения будут выключены, и код будет работать по-старому. А для того, чтобы перевести код в режим полного соответствия современному стандарту, нужно указать специальную директиву use strict
.
Эта директива не поддерживается IE9-.
Директива use strict
Директива выглядит как строка "use strict";
или 'use strict';
и ставится в начале скрипта.
Например:
"use strict";
// этот код будет работать по современному стандарту ES5
...
use strict
никак нельзяНе существует директивы no use strict
или подобной, которая возвращает в старый режим.
Если уж вошли в современный режим, то это дорога в один конец.
use strict
для функцийЧерез некоторое время мы будем проходить функции. На будущее заметим, что use strict
также можно указывать в начале функций, тогда строгий режим будет действовать только внутри функции.
В следующих главах мы будем подробно останавливаться на отличиях в работе языка при use strict
и без него.
Нужен ли мне «use strict»?
Если говорить абстрактно, то – да, нужен. В строгом режиме исправлены некоторые ошибки в дизайне языка, и вообще, современный стандарт – это хорошо.
Однако, есть и две проблемы.
- Поддержка браузеров IE9-, которые игнорируют
"use strict"
. - Предположим, что мы, используя
"use strict"
, разработали код и протестировали его в браузере Chrome. Всё работает… Однако, вероятность ошибок при этом в IE9- выросла! Он-то всегда работает по старому стандарту, а значит, иногда по-другому. Возникающие ошибки придётся отлаживать уже в IE9-, и это намного менее приятно, нежели в Chrome.Впрочем, проблема не так страшна. Несовместимостей мало. И если их знать (а в учебнике мы будем останавливаться на них) и писать правильный код, то всё будет в порядке и
"use strict"
станет нашим верным помощником. - Библиотеки, написанные без учёта
"use strict"
. - Некоторые библиотеки, которые написаны без
"use strict"
, не всегда корректно работают, если вызывающий код содержит"use strict"
.В первую очередь имеются в виду сторонние библиотеки, которые писали не мы, и которые не хотелось бы переписывать или править.
Таких библиотек мало, но при переводе давно существующих проектов на
"use strict"
эта проблема возникает с завидной регулярностью.
Вывод?
Писать код с use strict
следует лишь в том случае, если вы уверены, что описанных выше проблем не будет.
Конечно же, весь код, который находится в этом учебнике, корректно работает в режиме "use strict"
.
ES5-shim
Браузер IE8 поддерживает только совсем старую версию стандарта JavaScript, а именно ES3.
К счастью, многие возможности современного стандарта можно добавить в этот браузер, подключив библиотеку ES5 shim, а именно – скрипты es5-shim.js
и es5-sham.js
из неё.
Итого
В этой главе мы познакомились с понятием «строгий режим».
Далее мы будем предполагать, что разработка ведётся либо в современном браузере, либо в IE8- с подключённым ES5 shim. Это позволит нам использовать большинство возможностей современного JavaScript во всех браузерах.
Очень скоро, буквально в следующей главе, мы увидим особенности строгого режима на конкретных примерах.
Singleton Classes In Es6
Which means following is not possible in Es6 classes.
class Cache{
let instance = null;
}
In order to avoid re-instantiation of same class , we need to maintain it’s state inside a variable which itself is not dependent upon the same class.
Singleton class in es6
Following is my approach to have a single instance of a class , no matter how many time you reinitiate it.
/*
* Setting up block level variable to store class state
* , set's to null by default.
*/
let instance = null;
class Cache{
constructor() {
if(!instance){
instance = this;
}
// to test whether we have singleton or not
this.time = new Date()
return instance;
}
}
Testing singleton
On above class we have defined a time property to make sure we have singleton working properly.
let cache = new Cache()
console.log(cache.time);
setTimeout(function(){
let cache = new Cache();
console.log(cache.time);
},4000);
If it prints the same time for both the instances, it means we have a working singleton.