ссылается на объект глобальной области видимости. Поэтому если вы случайно неправильно вызовете метод в строгом режиме, JavaScript выдаст ошибку, если попытается прочесть что-то из
>this
, а не будет радостно работать с глобальным объектом.
К примеру, рассмотрим код, вызывающий конструктор без ключевого слова >new
, в случае чего >this
не будет ссылаться на создаваемый объект.
>function Person(name) { this.name = name; }
>var ferdinand = Person("Евлампий"); // ой-вэй
>console.log(name);
>// → Евлампий
Некорректный вызов >Person
успешно происходит, но возвращается как >undefined
и создаёт глобальную переменную >name
. В строгом режиме всё по-другому:
>"use strict";
>function Person(name) { this.name = name; }
>// Опаньки, мы ж забыли 'new'
>var ferdinand = Person("Евлампий");
>// → TypeError: Cannot set property 'name' of undefined
Нам сразу сообщают об ошибке. Очень удобно.
Строгий режим умеет ещё кое-что. Он запрещает вызывать функцию с несколькими параметрами с одним и тем же именем, и удаляет некоторые потенциально проблемные свойства языка (например, инструкцию >with
, которая настолько ужасна, что даже не обсуждается в этой книге).
Короче говоря, надпись >"use strict"
перед текстом программы редко причиняет проблемы, зато помогает вам видеть их.
Если язык не собирается помогать нам в поиске ошибок, приходится искать их сложным способом: запуская программу и наблюдая, делает ли она что-то так, как надо.
Делать это вручную, снова и снова – верный способ сойти с ума. К счастью, часто возможно написать другую программу, которая автоматизирует проверку вашей основной программы.
Для примера вновь обратимся к типу >Vector
.
>function Vector(x, y) {
> this.x = x;
> this.y = y;
>}
>Vector.prototype.plus = function(other) {
> return new Vector(this.x + other.x, this.y + other.y);
>};
Мы напишем программу, которая проверит, что наша реализация >Vector
работает, как нужно. Затем после каждого изменения реализации мы будем запускать проверочную программу, чтобы убедиться, что мы ничего не сломали. Когда мы добавим функциональности (к примеру, новый метод) к типу >Vector
, мы добавим проверок этой новой функциональности.
>function testVector() {
> var p1 = new Vector(10, 20);
> var p2 = new Vector(-10, 5);
> var p3 = p1.plus(p2);
> if (p1.x !== 10) return "облом: значение x не то";
> if (p1.y !== 20) return "облом: значение y не то";
> if (p2.x !== -10) return "облом: отрицательное значение x не то";
> if (p3.x !== 0) return "облом: результат сложения x не тот";
> if (p3.y !== 25) return "облом: результат сложения y не тот";