Выразительный JavaScript (Хавербеке) - страница 83

ссылается на объект глобальной области видимости. Поэтому если вы случайно неправильно вызовете метод в строгом режиме, 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 не тот";