Pull to refresh

Викторина для тех, кто любит Javascript больше ECMAscript

Reading time 2 min
Views 3.5K
Викторина для тех, кто любит JavaScript больше ECMAScript. Главный приз: пирожок на полке.

Update: Пояснение. Для тех кто совсем не в теме. ECMAScript — это стандарт языка, на котором основаны реализации JavaScript в современных браузерах. Именно этот стандарт определяет поведение программ в этой статье. JavaScript является «надстройкой» над ECMAScript.

Пояснение номер 2. Глюки IE не имеют прямого отношения к викторине поскольку это ошибки (ну или «особенности») реализации стандартов.



* Вопросы:

Вопрос 1. Что выведет следующая программа?

var a = 123;

function foo() {
   alert(typeof a);
   var a = '123';
}

foo();


Вопрос 2. Что выведет следующая программа?

alert(sum1(3, 4));
alert(sum2(3, 4));

function sum1(a, b) { return a + b; }
var sum2 = function(a, b) { return a + b; }


Вопрос 3. Что выведет следующая программа?

function foo(){
   return
   {
      code: 1
   };
}

alert(foo());


Вопрос 4. Что выведет следующая программа?

alert([1,2,].length + [,1,2].length);


Последний вопрос. Немного из другой области.

Вопрос 5. Как ускорить выполнение функции calc?

var Multiplier = 123; // в объекте Global

function calc() { var s = 0; for (var i = 0; i < arguments.length; i++) s += Multiplier * arguments[i]; return s; }


* Правильные ответы:

Ответ 1. «undefined»

Ответ 2. Сначала «7», затем ошибка.

Ответ 3. «undefined»

Ответ 4. «5»

Ответ 5. function calc() { var s = 0, m = Multiplier; for (var i = arguments.length; i--; ) s += m * arguments[i]; return s; }

* Правильные ответы с объяснением:

Ответ 1. «undefined»

При объявлении переменная помещается в область видимости, соответствующую функции, в которой она объявляется. Если переменная объявляется вне функций, она помещается в глобальную область видимости. Создание переменной происходит при получении управления функцией с её объявлением. Или программой, если переменная глобальна. При создании переменной в ECMAScript она приобретает значение undefined. Если переменная объявлена с инициализацией, инициализация происходит не в момент создания переменной, а при выполнении строки с инструкцией var.

Ответ 2. Сначала «7», затем ошибка.

Наиболее существенной разницей между заданием функции с использовании объявления (sum1) и заданием функции с помощью выражения (sum2) является то, что объявления осуществляются до выполнения кода, а выражение по мере его выполнения.

Ответ 3. «undefined»

Спецификация декларирует механизм автодополнения строк точками с запятой, приводящий к тому, что при наличии переноса строки инструкция до переноса может быть снабжена этим знаком. Здесь строка c «return» содержит допустимую языком инструкцию и, поскольку, далее следует перевод строки, срабатывает механизм автодополнения строк точками с запятой.

Ответ 4. «5»

Концевая запятая при задании массива отбрасывается без добавления к массиву пустого элемента.
Update для любящих IE. IE неправильно вставит пустой элемент в конец такого массива.

Ответ 5.

function calc() { var s = 0, m = Multiplier; for (var i = arguments.length; i--; ) s += m * arguments[i]; return s; }

Для большинства реализаций JavaScript верны два соображения: доступ к локальным переменным осуществляется быстрее, цикл «for (var i = arguments.length; i--; )» содержит меньше инструкций, чем обычный.

* Ссылки:

ru.wikipedia.org/wiki/ECMAScript

Спасибо за внимание.

P.S. Убрал белый цвет текста. Тому, кто читает этот блог, он не нужен.
Спасибо за статью. /terloger/

Tags:
Hubs:
+33
Comments 49
Comments Comments 49

Articles