Fucking interviews

Был на собеседовании в Люксофте в пятницу. Ну был подразумевается по телефону говорил + тестовое задание делал. Задание выложу завтра как узнаю результат. А вот по результатам нескольких последних собеседований у меня родился вопрос. Ребята почему вы так холите и лелеите ie6, ему бы на свалку.

Ну тоесть коронный вопрос у многих заключаеться вот в чем


function addListener(element, eventName, handler) {
	if (element.addEventListener) {
		element.addEventListener(eventName, handler, true);
	} else 
	if (element.attachEvent) {
		element.attachEvent('on' + eventName, handler);
	}
	else {
		element['on' + eventName] = handler;
	}
}

function handler(e){
	var e = window.event || e, 
		target = e.target || e.srcElement;
}

Конечно же поколение выросшее на jQuery не в состоянии на него ответить. Это прямо как цитата

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

И вы знаете я вот думаю что для того чтобы программить говнокод на jQuery совершенно не обязательно даже задумываться что в браузерах есть различия. jQuery настолько их все сглаживает что даже не смотря на то что в нем самом есть баги я на них натыкался раза три от силы.

Но что-то я запизделся. Я вроде говорил что все любят пример с Events API, а еще все любят вот это замыкание


var elements = document.getElementsByTagName("*");
for (var i = 0, j = elements.length; i < j; i++){
	(function(j){
		elements[j].onclick = function (){
			alert(j);
		}
	})(i);
}

Вот о нем сейчас и поговорим. Итак вот код. Он написан чистенько и по честному. То есть есть несколько вложенных замыканий в каждом из них первоначальная переменная обрастает меткой о том что она была в конкретном замыкании. В каждом замыкании переменная имеет новое название чтоб не было путаницы, все переменные обозначены только английскими буквами, ничего не переопределяется, не используются браузерные глюки, нету игр с очередностью выполнения операторов - это я называю по честному.

Задание думаю понятно, без Фаербага сказать что выведет код, а потом проверить, и если вы были не правы понять почему.


// глобальная область видимости
// переменная a
window.a = [{a:1}];

// первое замыкание 
// переменные b
(function (b){
	
	b.push({b:1});

	// второе замыкание 
	// переменные c, d, i
	(function(c){

		c.b.push({c:1});
		
		var d = [];
		for (var i in c.b){
			d[i] = c.b[i];
		}
		
		// третье замыкание 
		// переменные e, j, k
		(function(e){
		
			for (var j in e){
				for(var k in e[j]){
					e[j][k] = 2;
				}
			}
			
		})(d);

	})({b:b});

})(window.a);

console.log(window.a)

Каков бы ни был ваш ответ - пишите в каменты.

ЗЫ Это кстати ответ Болку

4 Комментарии “Fucking interviews

  1. Если поддержка IE6 стоит $1, а прибыль от всех пользователей IE6 $100, то ответ на вопрос «почему» очевиден.

  2. вы цифры с потолка взяли. уже если гугл отказывается от его поддержки то явно прибыл минимальна.

  3. Гы, попробовал подумать над первой задачей.

    Первая мысль которая пришла в голову, что на каждый элемент честно навешивается хэндлер, который алёртит его порядковый номер в дереве. Потом когда запустил, осознал свою ошибку, но подумал, что это какая-то ересь, и решил что все-таки лучше элементы получать через document.body.getElementsByTagName(‘*’). Далее я оказался близок к своему ответу за исключением баблинга. Вот про него-то родимого я не подумал. Так что не сдал, сажусь два.

    Второй пример, если хватит сил разобраться с этим обфускированным кодом, посмотрю завтра.

    А вообще конечно тоже не понимаю этих задач, имхо лучше уж спрашивать написать что-нибудь с рекурсией и по api того же jquery из разряда best practices

  4. он не обфусцированый просто имена переменных короткие
    если предложишь красивые длинные имена я заменю

Комментарии закрыты