Deerua about Coding -> JavaScript викторина от perfectionkills.com -> Комментарии

Блог о кодинге, автор Deerua

coding, javascript, css, html, php, jquery, mysql, deerua

Deerua about Coding

 Избранное

 Самые комментируемые за всю историю

 199 заметок ненаглядно

 Архив за 2010, 2009, 2008  год


Февраль 2010
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

 10 февраля 2010, 18:33       более 6-и месяцев назад

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 %)


Адрес для трекбеков: http://deer.org.ua/2010/02/10/2/ping/

 Теги: javascript

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

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

#1­ GreLI   10 февраля 2010, 19:08
Ответы неинтересны, их и так можно подобрать. Интересно почитать объяснения почему ответы именно таковы.
В третьем задании delete не выполняется потому что аргументы имеют свойство DontDelete, о чём писал kangax в предыдущей статье.
Хотел позадавать вопросы, однако, подумав, понял, что уже всё понимаю, в некоторых местах надо внимательней быть :), но кому-то может быть непонятно.

Vitaliy Bogdanets    10 февраля 2010, 20:43
Ниже очень интересно ответил Сергей :)

#2­ Сергей   10 февраля 2010, 20:05
Какая-то странная аргументация ответов в некоторых случаях:
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    10 февраля 2010, 21:04
1. JavaScript = Object = function = array, это к слову :) о понимании ;)

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

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

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

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

Комментировать

Комментарии появляются после премодерации
Текст Форматирование: ((http://ya.ru/ ссылка)) //курсив// **жирный** !!цитата!!

Имя

E-mail

Пожалуйста, укажите настоящий адрес. Он не будет отображаться.


Можно будет отписаться, когда надоест.


Автор сможет сделать его видимым всем. Если вы не хотели бы, чтобы ваш комментарий был опубликован, скажите об этом в тексте комментария.


Сначала подумай ;)

    (Ctrl + Enter)

Нужно создать сайт на 1С-Битрикс(Bitrix)?
Работает на движке e2 Selecta * All sources code was highlighted with w3club Highlighter.
deer.org.ua © 2008—2010 Vitaliy Bogdanets Deerua