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
.
Готовлюсь к собеседованию, вспоминаю замыкания, пример с 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).