JavaScript
- 11 ответов
- 0 вопросов
4
Вклад в тег
var theThing = null;
var replaceThing = function () {
var priorThing = theThing;
// сохранив функцию в переменной, мы невольно сохраняем и контекст (цепочку областей видимости)
// в котором она была объявлена
// т.е. в данном случае priorThing оказался в контексте unused
var unused = function () {
if (priorThing) {
console.log("hi");
}
};
// здесь ссылка на старый объект заменяется новым,
// старый объект ожидает съедения GC,
// unused так же отправится в пасть GC...
theThing = {
longStr: new Array(1000000).join('*'),
// ... и все бы хорошо, если бы не один нюанс который происходит здесь
// как там пишут: both functions share the same lexical environment
// т.е. здесь у функции будет тот же контекст что и у unused
// потому что контекст уже пошарен при создании unused
// т.е. ссылка на старый объект priorThing будет сохраняться
// в общем контексте someMethod каждый раз.
someMethod: function () {
console.log(someMessage);
}
};
};
setInterval(replaceThing, 1000); // вызываем 'replaceThing' каждую секунду
// агрумент n является примитивом, а примитив имутабелен
let fibonacci = _.memoize(function(n) {
return n < 2 ? n: fibonacci(n - 1) + fibonacci(n - 2);
});
console.time('first call');
console.log(fibonacci(50));
// => 12586269025
console.timeEnd('first call');
// => first call: 2.508ms
console.time('second call');
console.log(fibonacci(50));
// => 12586269025
console.timeEnd('second call');
// => second call: 0.300ms
let cachedFn = _.memoize((arr) => arr.length);
let arr = [1,2,3];
console.log(cachedFn(arr));
// => 3
arr.push(4);
console.log(cachedFn(arr));
// => 3 - !!!
console.log(cachedFn([...arr]));
// => 4