Примерчики:

Замыкания

Что мы увидим после запуска кода и почему?

for (var i = 0; i<10; i++){
    setTimeout(() => {console.log(i)}, 0)
}

Выведется 10 раз по 10.

setTimeout является вложенной функцией, которая имеет доступ к переменным внешней функции. Во внешней функции есть цикл for, в котором инициализируется переменная i — индекс для прохода по массиву. Через 0 секунд выполняется код функции, выводится значение i, которое на конец цикла равно 10, потому что оно проходит через 0, 1, 2, 3, 4... и останавливается на 10.

Решение проблемы: применение замыкания.

for (var i = 0; i < 10; i++) {
  // pass in the variable i so that each function 
  // has access to the correct index
  setTimeout(function(i_local) {
    return function() {
      console.log(i);
    }
  }(i), 0);
}

// Что будет в консоли?
var i = 10;
var array = [];


while (i--) {
    array.push(function() {
        return i + i;
    });
}


console.log([
    array[0](),
    array[1](),
]);
// Ответ

[-2; -2]

// Почему так

EcmaScript2015

const a = [1, 2, 3];
a[0] = 6;
a = [4, 5, 6];

Что выведется после исполнения следующего кода?

Потому что const относится к переменной непосредственно, а не к конкретному значению.
Идентификатор не может быть переназначен. Например, если константа указывает на объект, 
то сам объект может быть изменён.

База

Что выведется после исполнения следующего кода?

var a = { name: 'Jon', additional: { age: 12, sex: 'man' } };
var c = a;
c.name = 'Smith';
c.additional.age = 45;
console.log(a.name); // какой результат
console.log(a.additional.age); // какой результат

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


Что выведется после исполнения следующего кода?

var a = { name: 'Jon', additional: { age: 12, sex: 'man' } };
var c = Object.assign({}, a);
c.name = 'Smith';
c.additional.age = 45;
console.log(a.name); // какой результат
console.log(a.additional.age); // какой результат

Результат:

Потому что Object.assign делает поверхностное копирование, не deep в отличие от одноименного метода в lodash.


// На входе массив
var arr = [
 {name: 'width', value: 10}, 
 {name: 'height', value: 20}
];
// На выходе объект {width: 10, height: 20}
// Решение с lodash:

_.reduce(arr, function(a){result[a.name] = a.value;
return result;})

// Решение в лоб:

var result = {};

for(var a, a < arr.length, a++){
   result[arr[a].name] = arr[a].value;
}

Что выведется?

function Book() {
    this.name = 'foo'
}

Book.prototype = {
    getName: function() {
        return this.name;
    }
}

var book = new Book();

Book.prototype.getUpperName = function() {
    return this.getName().toUpperCase();
}

console.log(book.getUpperName());

/**
 * Есть функция и объект. Необходимо, чтобы функция в консоли вывела значение 'yandex'.
 * Как добиться желаемого не изменяя тело функции?
 */
function f() { console.log(this.x); }
var obj = {x: 'yandex'};

// Ответ: this просто передать с помощью call

var b = {};
var c;

b.b = 1;
c = b;
c.b = 2;

console.log('1)', b.b); // ?
console.log('2)', c.b); // ?

var a = { counter: 1 };
function inc(obj) {
    obj.counter++;
    obj.changed = true;
}

inc(a);
console.log('3)', a);   // ?

var d = 'test';
d.d = 1;
console.log('4)', d.d); // ?

results matching ""

    No results matching ""