Frontend разработчик - распределение обязаностей и требования

function foo(arr) {
  var mass = [];
  for (var i = 0; i < arr.length; i += 1) {
    arg = arr[i];
    mass.push(function () {
      return arg;
    });
  }
  return mass;
}

Интересно, почему вот так работает:

function foo(arr) {
    var res = [];
    for (var i=0; i<arr.length; i+=1) {
    	var value = arr[i];
    	// var newFunc = function (value) {
    	// 	return value;
    	// };
     	var newFunc = (function (n) {
     		return function () {
     			return n;
     			};
     	})(value); 
    	res.push(newFunc);
    }
    return res;
}
console.log( foo( [5, 7, 4] )[0]());    // напечатает 5

А вот так нет:

function foo(arr) {
    var res = [];
    for (var i=0; i<arr.length; i+=1) {
    	var value = arr[i];
    	var newFunc = function (value) {
    		return value;
    	 };
    	res.push(newFunc);
    }
    return res;
}
console.log( foo( [5, 7, 4] )[0]());    // напечатает 5

Во втором случае мы же тоже вовзаращем значение (value), которое замыкается внутри этой функции

Подскажу примером кода, который технически делает тоже самое, что и неработающий вариант: функция использует значение переменной из родительской области видимости, значение переменной изменяется.

var a = 20;
function func() {
	return a;
}
console.log(func()); // 20
a = 30;
console.log(func()); // 30

Будет понятно, когда ты ответишь для себя на вопрос чему равно значение переменной value в тот момент, когда вызывается функция newFunc.

1 лайк

Готовлюсь к собеседованию, вспоминаю замыкания, пример с http://javascript.ru/

function makeShout() { // (1)
var phrase = "Превед!"  // (2)

var shout = function() {  // (3,4)
    alert(phrase)
}

phrase = "Готово!"  // (5)

return shout
}

shout = makeShout()
// что выдаст?
shout()

В разъяснениях понятно, что по сколько в внутри var shout = … нет phrase, оно ищет его на уровень выше, но что если бы мне нужно было выдать там именно phrase = “Превед!” ?? По моей логике, для этого должно быть достаточно передать туда аргументом phrase…но если мы это сделаем

var shout = function(phrase) {  // (3,4)
    alert(phrase)
}

тогда phase === undefined, почему так? и как тогда правильно передать внутрь

 var shout = function...

phrase = “Превед!”??

Направление мышления корректное. Только ты упускаешь то, каким образом формируются параметры функции.

shout(); // передается ли аргумент в функцию?

Не изменять значение переменной phrase. Убрать строчку, которая помечена комментом (5).

спасибо, понял

да…еще возможно будет кому-то интересная задачка, но и мне интересен ответ…
Предисловее: помню на предыдущем собеседовании мне дали задачку, с которой ну я совсем никак не справился, условия просты, есть какой-то большой пасив, нужно по значению узнать его индекс…и нужно это сделать быстрее чем arr.indexOf(value)…тогда я вообще выпал в осадок…Вопрос к знатокам, как такое делать? пришел домой гуглил, никакой функции аля “find” нет…точнее есть


но она еще не поддерживается нигде кроме ФФ, вряд ли это они хотели…
Дальше думаем…что-то…что должно работать быстрее чем нативная функция JS…странно…ладно, думаем дальше, большой масив…как искать что-то в большом массиве? найти это в меньшем массиве…думал пересоздавать маньший массив, обрезая предыдущие значения…но выглядит как хардкодинг…и имеет смысл, лишь в данном структуре массива…что опять же не есть хорошо…да и в итоге…я выигрываю буквально несколько милисекунд…Какие есть еще варианты?
пример кода пишу по памяти :

	var arr = [], i = 0;

while (arr.length < 20000000) {
	arr.push(i+=2);
}
  console.time('search1');
  console.log(quickSearch(19999998));
  console.timeEnd('search1');
  function quickSearch (searchElement) {
     return arr.indexOf(searchElement);
  }

Если массив отсортирован по какому-то признаку, можно использовать binary search.

Или вариант, который может оказаться медленнее - создать хешмеп (считай объект), в котором ключи - это значения из массива, а значения - индексы значения массива. Сработает только если значения в массиве уникальны.

var arr = ['lorem', 'ipsum', 'dolor']
var hashMap = {lorem: 0, ipsum: 1, dolor: 2}

Обычно front-end разработчик— это мастер на все руки. … Современный front-end developer должен легко владеть html5, css3, JavaScript (и как минимум JQuery).

1 лайк