10 февраля 2010, 18:33 более 6-и месяцев назад
JavaScript викторина от perfectionkills.com
С утра твитор порадовал интересной викториной.
Немного подумав над ней, оказалось что решил я её без ошибок \m/, в отличии от многих других ;) (если бы на время, то наверное бы слил)…
По просьбам трудящихся, небольшие объяснения (в комментариях к викторине их можно частями найти)
Немного подумав над ней, оказалось что решил я её без ошибок \m/, в отличии от многих других ;) (если бы на время, то наверное бы слил)…
По просьбам трудящихся, небольшие объяснения (в комментариях к викторине их можно частями найти)
(function(){ return typeof arguments; })();
Вернёт object, потому что arguments всегда задана, и выводит все переменные которые приходят в функциюvar f = function g(){ return 23; }; typeof g();
Получим ошибку, фугкция g() не объявлена. Если запустить f() получим «number»(function(x){ delete x; return x; })(1);
Небольшой подвох ;) Delete внутри функций не работает ;) Ответ 1var y = 1, x = y = typeof x; x;
Объявление в «колоне» идёт слева на право, получаем в итоге строку «undefined»(function f(f){ return typeof f(); })(function(){ return 1; });
функция выполняется вконце, возвращает 1, она же идёт в начало аргументом функции f(), и тип 1 — «number»var foo = { bar: function() { return this.baz; }, baz: 1 }; (function(){ return typeof arguments[0](); })(foo.bar);
Есть объект foo с методом bar, и функция которой в качестве аргумента передаём наш метод. Почему в итоге не «function»? this в обжекте ;) Лол! ок!var foo = { bar: function(){ return this.baz; }, baz: 1 } typeof (f = foo.bar)();
А ну как конструкция, гибкость? :) смотрим вышеvar f = (function f(){ return "1"; }, function g(){ return 2; })(); typeof f;
исполняется последняя в списке функция g() — потому «number»var x = 1; if (function f(){}) { x += typeof f; } x;
Опять функция в условии (смотри 2), в итоге получаем «1undefined»var x = [typeof x, typeof y][1]; typeof typeof x;
типоф от типоф всегда стринг ;)))(function(foo){ return typeof foo.bar; })({ foo: { bar: 1 } });
у нас просто получилось foo.foo.bar = 1, обжект в обжекте — масло масляное, потому «undefined»(function f(){ function f(){ return 1; } return f(); function f(){ return 2; } })();
Последняя объявленная нижняя, потому получаем 2 %)function f(){ return f; } new f() instanceof f;
инстансоф буллевый оператор, и итог функции f() не может быть в «движении» функции f.with (function(x, undefined){}) length;
оператор with поиска находит оба аргумента, получаем 2 %)
2 комментария
#2
Какая-то странная аргументация ответов в некоторых случаях:
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!
1. Подвох не в том, что переменная arguments внутри функции всегда определена, а в том, что ее можно спутать с массивом,
2. Да, технически функция не объявлялась, а использовалось функциональное выражение (function expression), чье имя, если оно задано, доступно только внутри этой функции (
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,
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 ошибок ;) хотел получить развёрнутые ответы ;)
ззы: огромное спасибо за ответ!
зззы: джс не учил как язык, опыт ;)
2. arguments.callee = function(){} внутри ;) + ответ на 1 квиз.
3. Да, читал :) по сути делит убивает переменные внутри массива не декрементируя длину массива.
6.7. это имелось ввиду ;)
зы: это был пост провокация :) на самом деле у меня было 5 ошибок ;) хотел получить развёрнутые ответы ;)
ззы: огромное спасибо за ответ!
зззы: джс не учил как язык, опыт ;)
В третьем задании delete не выполняется потому что аргументы имеют свойство DontDelete, о чём писал kangax в предыдущей статье.
Хотел позадавать вопросы, однако, подумав, понял, что уже всё понимаю, в некоторых местах надо внимательней быть :), но кому-то может быть непонятно.