10 февраля 2010, 18:33

JavaScript викторина от perfectionkills.com

С утра твитор порадовал интересной викториной.

Немного подумав над ней, оказалось что решил я её без ошибок \m/, в отличии от многих других ;) (если бы на время, то наверное бы слил)...

По просьбам трудящихся, небольшие объяснения (в комментариях к викторине их можно частями найти)
  1. (function(){
      return typeof arguments;
    })();
    Вернёт object, потому что arguments всегда задана, и выводит все переменные которые приходят в функцию
  2. var f = function g(){ return 23; };
    typeof g();
    Получим ошибку, фугкция g() не объявлена. Если запустить f() получим «number»
  3. (function(x){
    delete x;
    return x;
    })(1);
    Небольшой подвох ;) Delete внутри функций не работает ;) Ответ 1
  4. var y = 1, x = y = typeof x;
    x;
    Объявление в «колоне» идёт слева на право, получаем в итоге строку «undefined»
  5. (function f(f){ 
    return typeof f(); 
    })(function(){ return 1; });
    функция выполняется вконце, возвращает 1, она же идёт в начало аргументом функции f(), и тип 1 — «number»
  6. var foo = { 
    bar: function() { return this.baz; }, 
    baz: 1
    };
    (function(){ 
    return typeof arguments[0]();
    })(foo.bar);
    Есть объект foo с методом bar, и функция которой в качестве аргумента передаём наш метод. Почему в итоге не «function»? this в обжекте ;) Лол! ок!
  7. var foo = {
    bar: function(){ return this.baz; },
    baz: 1
    }
    typeof (f = foo.bar)();
    А ну как конструкция, гибкость? :) смотрим выше
  8. var f = (function f(){ return "1"; }, function g(){ return 2; })();
    typeof f;
    исполняется последняя в списке функция g() — потому «number»
  9. var x = 1;
    if (function f(){}) {
    x += typeof f;
    }
    x;
    Опять функция в условии (смотри 2), в итоге получаем «1undefined»
  10. var x = [typeof x, typeof y][1];
    typeof typeof x;
    типоф от типоф всегда стринг ;)))
  11. (function(foo){
    return typeof foo.bar;
    })({ foo: { bar: 1 } });
    у нас просто получилось foo.foo.bar = 1, обжект в обжекте — масло масляное, потому «undefined»
  12. (function f(){
    function f(){ return 1; }
    return f();
    function f(){ return 2; }
    })();
    Последняя объявленная нижняя, потому получаем 2 %)
  13. function f(){ return f; }
    new f() instanceof f;
    инстансоф буллевый оператор, и итог функции f() не может быть в «движении» функции f.
  14. with (function(x, undefined){}) length;
    оператор with поиска находит оба аргумента, получаем 2 %)


2 комментария РСС

GreLI
Ответы неинтересны, их и так можно подобрать. Интересно почитать объяснения почему ответы именно таковы.
В третьем задании delete не выполняется потому что аргументы имеют свойство DontDelete, о чём писал kangax в предыдущей статье.
Хотел позадавать вопросы, однако, подумав, понял, что уже всё понимаю, в некоторых местах надо внимательней быть :), но кому-то может быть непонятно.
Vitaliy Bogdanets
Ниже очень интересно ответил Сергей :)
Сергей
Какая-то странная аргументация ответов в некоторых случаях:
1. Подвох не в том, что переменная arguments внутри функции всегда определена, а в том, что ее можно спутать с массивом, т. к. по сути она массивом и является.

2. Да, технически функция не объявлялась, а использовалось функциональное выражение (function expression), чье имя, если оно задано, доступно только внутри этой функции (т. е. равно arguments.callee). Соответственно, функция g извне не видна.

3. Причем тут delete внутри функции? Правильно думать, что этот оператор переменные, определенные через var, не удаляет вообще (по стандарту ECMAScript у них имеется свойство DontDelete). При попытке это сделать, вернется false.

5. К тому же, аргумент f функции f перекрывает ее значение.

6, 7. Тут вообще какой-то бред, а не объяснение :). Должен стоять вопрос, почему здесь не «number», потому как на первый взгляд foo.bar() ссылается на foo.baz= =1, но this в данном контексте ссылается на объект window, так что ответ «undefined» (this.baz = = window.baz).

8.Дополню, что выполняется последняя функция потому, что используется оператор запятая.

9. Опять, стоит различать тонкую грань между function expression и function declaration.

13. Фишка в том, что функция не может быть instanceof от себя. Слева должен быть объект. Наглядно показано на примере:
String instanceof String // false, typeof String = = «function»
new String instanceof String // true, typeof new String = = «object»

14. У оператора with другая роль. Код равнозначен (function(undefined, undefined){}).length, т. к. любая функция имеет член данных length:
function f(){}
f.length // 0

З.Ы. Я всего лишь год занимаюсь программированием на Javascript. Правильно и без особых раздумий удалось ответить наполовину. Но таких странных объяснений я еще не встречал =) Peace!
Vitaliy Bogdanets
1. JavaScript = Object = function = array, это к слову :) о понимании ;)

2. arguments.callee = function(){} внутри ;) + ответ на 1 квиз.

3. Да, читал :) по сути делит убивает переменные внутри массива не декрементируя длину массива.

6.7. это имелось ввиду ;)

зы: это был пост провокация :) на самом деле у меня было 5 ошибок ;) хотел получить развёрнутые ответы ;)
ззы: огромное спасибо за ответ!
зззы: джс не учил как язык, опыт ;)

Ваш комментарий

адрес не будет опубликован

ХТМЛ не работает


Ctrl + Enter