ÐизкоÑÑовневÑе ÑзÑки пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (напÑимеÑ, C) имеÑÑ Ð½Ð¸Ð·ÐºÐ¾ÑÑовневÑе пÑимиÑÐ¸Ð²Ñ Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑÑÑ, Ñакие как malloc()
и free()
. Ð JavaScript же памÑÑÑ Ð²ÑделÑеÑÑÑ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑки пÑи Ñоздании ÑÑÑноÑÑей (Ñ.е., обÑекÑов, ÑÑÑок и Ñ.п.) и "авÑомаÑиÑеÑки" оÑвобождаеÑÑÑ, когда они болÑÑе не иÑполÑзÑÑÑÑÑ. ÐоÑледний пÑоÑеÑÑ Ð½Ð°Ð·ÑваеÑÑÑ ÑбоÑкой мÑÑоÑа . Слово "авÑомаÑиÑеÑки" ÑвлÑеÑÑÑ Ð¸ÑÑоÑником пÑÑаниÑÑ Ð¸ заÑаÑÑÑÑ ÑоздаÑÑ Ñ Ð¿ÑогÑаммиÑÑов на JavaScript (и дÑÑгиÑ
вÑÑокоÑÑовневÑÑ
ÑзÑкаÑ
) ложное оÑÑÑение, ÑÑо они могÑÑ Ð½Ðµ забоÑиÑÑÑÑ Ð¾Ð± ÑпÑавлении памÑÑÑÑ.
ÐезавиÑимо Ð¾Ñ ÑзÑка пÑогÑаммиÑованиÑ, жизненнÑй Ñикл памÑÑи пÑакÑиÑеÑки вÑегда один и ÑÐ¾Ñ Ð¶Ðµ:
ÐеÑвÑе два пÑнкÑа оÑÑÑеÑÑвлÑÑÑÑÑ ÑвнÑм обÑазом (Ñ.е., непоÑÑедÑÑвенно пÑогÑаммиÑÑом) во вÑÐµÑ ÑзÑÐºÐ°Ñ Ð¿ÑогÑаммиÑованиÑ. ТÑеÑий пÑÐ½ÐºÑ Ð¾ÑÑÑеÑÑвлÑеÑÑÑ ÑвнÑм обÑазом в низкоÑÑовневÑÑ ÑзÑÐºÐ°Ñ , но в болÑÑинÑÑве вÑÑокоÑÑовневÑÑ ÑзÑков, в Ñом ÑиÑле и в JavaScript, оÑÑÑеÑÑвлÑеÑÑÑ Ð°Ð²ÑомаÑиÑеÑки.
ÐÑделение памÑÑи в JavaScript ÐÑделение памÑÑи пÑи иниÑиализаÑии знаÑений пеÑеменнÑÑЧÑÐ¾Ð±Ñ Ð½Ðµ ÑÑÑÑждаÑÑ Ð¿ÑогÑаммиÑÑа забоÑой о низкоÑÑовневÑÑ Ð¾Ð¿ÐµÑаÑиÑÑ Ð²ÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑи, инÑеÑпÑеÑаÑÐ¾Ñ JavaScript динамиÑеÑки вÑделÑÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð¿Ñи обÑÑвлении пеÑеменнÑÑ :
var n = 123; // вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð´Ð»Ñ Ñипа number
var s = "azerty"; // вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð´Ð»Ñ Ñипа string
var o = {
a: 1,
b: null,
}; // вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð´Ð»Ñ Ñипа object и вÑеÑ
его внÑÑÑенниÑ
пеÑеменнÑÑ
var a = [1, null, "abra"]; // (like object) вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð´Ð»Ñ array и его внÑÑÑенниÑ
знаÑений
function f(a) {
return a + 2;
} // вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð´Ð»Ñ function (коÑоÑÐ°Ñ Ð¿ÑедÑÑавлÑÐµÑ Ñобой вÑзÑваемÑй обÑекÑ)
// ÑÑнкÑионалÑнÑе вÑÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ñакже вÑделÑÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð¿Ð¾Ð´ object
someElement.addEventListener(
"click",
function () {
someElement.style.backgroundColor = "blue";
},
false,
);
ÐÑделение памÑÑи пÑи вÑзоваÑ
ÑÑнкÑий
ÐÑÐ·Ð¾Ð²Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ ÑÑнкÑий Ñакже ведÑÑ Ðº вÑÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑи под обÑекÑ:
var d = new Date();
var e = document.createElement("div"); // вÑделÑÐµÑ Ð¿Ð°Ð¼ÑÑÑ Ð¿Ð¾Ð´ DOM-ÑлеменÑ
ÐекоÑоÑÑе меÑÐ¾Ð´Ñ Ð²ÑделÑÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð´Ð»Ñ Ð½Ð¾Ð²ÑÑ Ð·Ð½Ð°Ñений или обÑекÑов:
var s = "azerty";
var s2 = s.substr(0, 3); // s2 ÑÑо новÑй обÑÐµÐºÑ Ñипа string
// Т.к. ÑÑÑоки - ÑÑо поÑÑоÑннÑе знаÑениÑ, инÑеÑпÑеÑаÑÐ¾Ñ Ð¼Ð¾Ð¶ÐµÑ ÑеÑиÑÑ, ÑÑо памÑÑÑ Ð²ÑделÑÑÑ Ð½Ðµ нÑжно, но нÑжно лиÑÑ ÑоÑ
ÑаниÑÑ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ [0, 3].
var a = ["ouais ouais", "nan nan"];
var a2 = ["generation", "nan nan"];
var a3 = a.concat(a2); // новÑй маÑÑив Ñ 4 ÑлеменÑами в ÑезÑлÑÑаÑе конкаÑенаÑии ÑлеменÑов 'a' и 'a2'
ÐÑполÑзование знаÑений
"ÐÑполÑзование знаÑений", как пÑавило, ознаÑÐ°ÐµÑ - ÑÑение и запиÑÑ Ð·Ð½Ð°Ñений из/в вÑделенной Ð´Ð»Ñ Ð½Ð¸Ñ Ð¾Ð±Ð»Ð°ÑÑи памÑÑи. ÐÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¿Ñи ÑÑении или запиÑи знаÑÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð¹-либо пеÑеменной, или ÑвойÑÑва обÑекÑа или даже пÑи пеÑедаÑе аÑгÑменÑа ÑÑнкÑии.
ÐÑвобождение памÑÑи, когда она более не нÑжнаÐменно на ÑÑом ÑÑапе поÑвлÑеÑÑÑ Ð±Ð¾Ð»ÑÑинÑÑво пÑоблем из облаÑÑи "ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑÑÑ". Ðаиболее Ñложной задаÑей в данном ÑлÑÑае ÑвлÑеÑÑÑ ÑÑÑкое опÑеделение Ñого моменÑа, когда "вÑÐ´ÐµÐ»ÐµÐ½Ð½Ð°Ñ Ð¿Ð°Ð¼ÑÑÑ Ð±Ð¾Ð»ÐµÐµ не нÑжна". ÐаÑаÑÑÑÑ Ð¿ÑогÑаммиÑÑ Ñам должен опÑеделиÑÑ, ÑÑо в данном меÑÑе пÑогÑÐ°Ð¼Ð¼Ñ Ð´Ð°Ð½Ð½Ð°Ñ ÑаÑÑÑ Ð¿Ð°Ð¼ÑÑи более Ñже не нÑжна и оÑвободиÑÑ ÐµÑ.
ÐнÑеÑпÑеÑаÑоÑÑ ÑзÑков вÑÑокого ÑÑÐ¾Ð²Ð½Ñ ÑнабжаÑÑÑÑ Ð²ÑÑÑоеннÑм пÑогÑаммнÑм обеÑпеÑением под названием "ÑбоÑÑик мÑÑоÑа", задаÑей коÑоÑого ÑвлÑеÑÑÑ ÑледиÑÑ Ð·Ð° вÑделением и иÑполÑзованием памÑÑи и пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи авÑомаÑиÑеÑки оÑвобождаÑÑ Ð±Ð¾Ð»ÐµÐµ не нÑжнÑе ÑÑаÑÑки памÑÑи. ÐÑо пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð²ÐµÑÑма пÑиблизиÑелÑно, Ñак как оÑÐ½Ð¾Ð²Ð½Ð°Ñ Ð¿Ñоблема ÑоÑного опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñого моменÑа, когда какаÑ-либо ÑаÑÑÑ Ð¿Ð°Ð¼ÑÑи более не нÑжна - неÑазÑеÑима (Ñ.е., Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ñоблема не поддаÑÑÑÑ Ð¾Ð´Ð½Ð¾Ð·Ð½Ð°ÑÐ½Ð¾Ð¼Ñ Ð°Ð»Ð³Ð¾ÑиÑмиÑеÑÐºÐ¾Ð¼Ñ ÑеÑениÑ).
СбоÑка мÑÑоÑаÐак Ñже ÑпоминалоÑÑ Ð²ÑÑе, пÑоблема ÑоÑного опÑеделениÑ, когда какаÑ-либо ÑаÑÑÑ Ð¿Ð°Ð¼ÑÑи "более не нÑжна" - однознаÑно неÑазÑеÑима. Ð ÑезÑлÑÑаÑе ÑбоÑÑики мÑÑоÑа ÑеÑаÑÑ Ð¿Ð¾ÑÑавленнÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð»Ð¸ÑÑ ÑаÑÑиÑно. Ð ÑÑом Ñазделе Ð¼Ñ Ð¾Ð±ÑÑÑним оÑновополагаÑÑие моменÑÑ, Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе Ð´Ð»Ñ Ð¿Ð¾Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¿ÑинÑипа дейÑÑÐ²Ð¸Ñ Ð¾ÑновнÑÑ Ð°Ð»Ð³Ð¾ÑиÑмов ÑбоÑки мÑÑоÑа и Ð¸Ñ Ð¾Ð³ÑаниÑений.
СÑÑлкиÐолÑÑÐ°Ñ ÑаÑÑÑ Ð°Ð»Ð³Ð¾ÑиÑмов ÑбоÑки мÑÑоÑа оÑнована на понÑÑии ÑÑÑлки. РконÑекÑÑе ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð°Ð¼ÑÑÑÑ Ð¾Ð±ÑÐµÐºÑ ÑÑиÑаеÑÑÑ ÑÑÑлаÑÑимÑÑ Ð½Ð° дÑÑгой обÑекÑ, еÑли Ñ Ð¿ÐµÑвого еÑÑÑ Ð´Ð¾ÑÑÑп ко вÑоÑÐ¾Ð¼Ñ (неважно - ÑвнÑй или неÑвнÑй). РпÑимеÑÑ, каждÑй обÑÐµÐºÑ JavaScript Ð¸Ð¼ÐµÐµÑ ÑÑÑÐ»ÐºÑ Ð½Ð° Ñвой пÑоÑоÑип (неÑÐ²Ð½Ð°Ñ ÑÑÑлка) и ÑÑÑлки на знаÑÐµÐ½Ð¸Ñ ÑÐ²Ð¾Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ¹ (ÑвнÑе ÑÑÑлки).
Рданном конÑекÑÑе понÑÑие "обÑекÑ" понимаеÑÑÑ Ð½ÐµÑколÑко ÑиÑе, нежели Ð´Ð»Ñ ÑипиÑнÑÑ JavaScript-обÑекÑов и дополниÑелÑно вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ Ð¿Ð¾Ð½ÑÑие облаÑÑей видимоÑÑи ÑÑнкÑий (или глобалÑной лекÑиÑеÑкой облаÑÑи)
СбоÑка мÑÑоÑа на оÑнове подÑÑÑÑа ÑÑÑлокÐÑо наиболее пÑимиÑивнÑй алгоÑиÑм ÑбоÑки мÑÑоÑа, ÑÑжаÑÑий понÑÑие "обÑÐµÐºÑ Ð±Ð¾Ð»ÐµÐµ не нÑжен" до "Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ обÑекÑа более Ð½ÐµÑ Ð½Ð¸ одного обÑекÑа, ÑÑÑлаÑÑегоÑÑ Ð½Ð° него". ÐбÑÐµÐºÑ ÑÑиÑаеÑÑÑ Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð°Ñим ÑниÑÑÐ¾Ð¶ÐµÐ½Ð¸Ñ ÑбоÑÑиком мÑÑоÑа, еÑли колиÑеÑÑво ÑÑÑлок на него Ñавно нÑлÑ.
ÐÑимеÑvar o = {
a: {
b: 2,
},
}; // Ñоздано 2 обÑекÑа. Ðдин ÑÑÑлаеÑÑÑ Ð½Ð° дÑÑгой как на одно из ÑвоиÑ
полей.
// ÐÑоÑой Ð¸Ð¼ÐµÐµÑ Ð²Ð¸ÑÑÑалÑнÑÑ ÑÑÑлкÑ, поÑколÑÐºÑ Ð¿ÑиÑвоен в каÑеÑÑве знаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеменной 'o'.
// ÐÑевидно, ÑÑо ни один из ниÑ
не Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð¸Ñ ÑбоÑке мÑÑоÑа.
var o2 = o; // пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ 'o2' - вÑоÑÐ°Ñ ÑÑÑлка на обÑекÑ
o = 1; // ÑепеÑÑ Ð¾Ð±ÑекÑ, имевÑий изнаÑалÑно ÑÑÑÐ»ÐºÑ Ð½Ð° ÑÐµÐ±Ñ Ð¸Ð· 'o' Ð¸Ð¼ÐµÐµÑ ÑникалÑнÑÑ ÑÑÑÐ»ÐºÑ ÑеÑез пеÑеменнÑÑ 'o2'
var oa = o2.a; // ÑÑÑлка на поле 'a' обÑекÑа.
// ТепеÑÑ Ð½Ð° обÑÐµÐºÑ 2 ÑÑÑлки: одна на его поле и вÑоÑÐ°Ñ - пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ 'oa'
o2 = "yo"; // ÐбÑекÑ, на коÑоÑÑй изнаÑалÑно ÑÑÑлалаÑÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ 'o', ÑепеÑÑ Ð¸Ð¼ÐµÐµÑ Ð½Ð¾Ð»Ñ ÑÑÑлок на неÑ.
// ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ ÑниÑÑожен пÑи ÑбоÑке мÑÑоÑа.
// Ðднако, на его поле 'a' вÑÑ ÐµÑÑ ÑÑÑлаеÑÑÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ 'oa', Ñак ÑÑо ÑдалÑÑÑ ÐµÐ³Ð¾ еÑÑ Ð½ÐµÐ»ÑзÑ
oa = null; // оÑигиналÑное знаÑение Ð¿Ð¾Ð»Ñ Ð¾Ð±ÑекÑа 'a' в пеÑеменной o Ð¸Ð¼ÐµÐµÑ Ð½Ð¾Ð»Ñ ÑÑÑлок на ÑебÑ.
// можно ÑниÑÑожиÑÑ Ð¿Ñи ÑбоÑке мÑÑоÑа.
ÐгÑаниÑение : ÑиклиÑеÑкие ÑÑÑлки
ÐÑновное огÑаниÑение данного наивного алгоÑиÑма заклÑÑаеÑÑÑ Ð² Ñом, ÑÑо еÑли два обÑекÑа ÑÑÑлаÑÑÑÑ Ð´ÑÑг на дÑÑга (ÑÐ¾Ð·Ð´Ð°Ð²Ð°Ñ Ñаким обÑазом ÑиклиÑеÑкÑÑ ÑÑÑлкÑ), они не могÑÑ Ð±ÑÑÑ ÑниÑÑÐ¾Ð¶ÐµÐ½Ñ ÑбоÑÑиком мÑÑоÑа, даже еÑли "более не нÑжнÑ".
function f() {
var o = {};
var o2 = {};
o.a = o2; // o ÑÑÑлаеÑÑÑ Ð½Ð° o2
o2.a = o; // o2 ÑÑÑлаеÑÑÑ Ð½Ð° o
return "azerty";
}
f();
СоздаÑÑÑÑ Ð´Ð²Ð° ÑÑÑлаÑÑÐ¸Ñ ÑÑ Ð´ÑÑг на дÑÑга обÑекÑа, ÑÑо поÑÐ¾Ð¶Ð´Ð°ÐµÑ ÑиклиÑеÑкÑÑ ÑÑÑлкÑ. Ðни не бÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð· облаÑÑи видимоÑÑи ÑÑнкÑии поÑле завеÑÑÐµÐ½Ð¸Ñ ÑабоÑÑ ÑÑой ÑÑнкÑии, Ñаким обÑазом, ÑбоÑÑик мÑÑоÑа не ÑÐ¼Ð¾Ð¶ÐµÑ Ð¸Ñ ÑдалиÑÑ, неÑмоÑÑÑ Ð½Ð° Ð¸Ñ Ð¾ÑевиднÑÑ Ð½ÐµÐ½ÑжноÑÑÑ. Так как ÑбоÑÑик мÑÑоÑа ÑÑиÑаеÑ, ÑÑо, Ñаз на каждÑй из обÑекÑов ÑÑÑеÑÑвÑÐµÑ ÐºÐ°Ðº минимÑм одна ÑÑÑлка, Ñо ÑниÑÑожаÑÑ Ð¸Ñ Ð½ÐµÐ»ÑзÑ.
ÐÑÐ¸Ð¼ÐµÑ Ð¸Ð· ÑеалÑной жизниÐÑаÑзеÑÑ Internet Explorer веÑÑий 6, 7 имеÑÑ ÑбоÑÑик мÑÑоÑа Ð´Ð»Ñ DOM-обÑекÑов, ÑабоÑаÑÑий по пÑинÑÐ¸Ð¿Ñ Ð¿Ð¾Ð´ÑÑÑÑа ÑÑÑлок. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ñе бÑаÑзеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ легко пÑинÑдиÑÑ Ðº поÑÐ¾Ð¶Ð´ÐµÐ½Ð¸Ñ ÑиÑÑемаÑиÑеÑÐºÐ¸Ñ ÑÑеÑек памÑÑи (memory leaks) ÑледÑÑÑим обÑазом:
var div;
window.onload = function () {
div = document.getElementById("myDivElement");
div.circularReference = div; // DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ "myDivElement" полÑÑÐ°ÐµÑ ÑÑÑÐ»ÐºÑ Ð½Ð° ÑебÑ
div.lotsOfData = new Array(10000).join("*");
};
DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ "myDivElement" Ð¸Ð¼ÐµÐµÑ ÑиклиÑеÑкÑÑ ÑÑÑÐ»ÐºÑ Ð½Ð° Ñамого ÑÐµÐ±Ñ Ð² поле "circularReference". ÐÑли ÑÑо ÑвойÑÑво не бÑÐ´ÐµÑ Ñвно Ñдалено или ÑÑÑановлено в null, ÑбоÑÑик мÑÑоÑа вÑегда бÑÐ´ÐµÑ Ð¾Ð¿ÑеделÑÑÑ Ñ Ð¾ÑÑ Ð±Ñ Ð¾Ð´Ð½Ñ ÑÑÑÐ»ÐºÑ Ð½Ð° DOM-ÑлеменÑ, и бÑÐ´ÐµÑ Ð´ÐµÑжаÑÑ DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð² памÑÑи, даже еÑли DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑдалÑÑ Ð¸Ð· DOM-деÑева. Таким обÑазом, еÑли DOM-ÑÐ»ÐµÐ¼ÐµÐ½Ñ ÑодеÑÐ¶Ð¸Ñ Ð¼Ð½Ð¾Ð³Ð¾ даннÑÑ (иллÑÑÑÑиÑÑеÑÑÑ Ð¿Ð¾Ð»ÐµÐ¼ "lotsOfData"), Ñо памÑÑÑ, иÑполÑзÑÐµÐ¼Ð°Ñ Ð¿Ð¾Ð´ ÑÑи даннÑе, никогда не бÑÐ´ÐµÑ Ð¾Ñвобождена.
ÐлгоÑиÑм "Mark-and-sweep"ÐаннÑй алгоÑиÑм ÑÑÐ¶Ð°ÐµÑ Ð¿Ð¾Ð½ÑÑие "обÑÐµÐºÑ Ð±Ð¾Ð»ÐµÐµ не нÑжен" до "обÑÐµÐºÑ Ð½ÐµÐ´Ð¾ÑÑÑпен".
ÐÑновÑваеÑÑÑ Ð½Ð° понÑÑии о набоÑе обÑекÑов, назÑваемÑÑ roots (в JavaScript root'ом ÑвлÑеÑÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй обÑекÑ). СбоÑÑик мÑÑоÑа пеÑиодиÑеÑки запÑÑкаеÑÑÑ Ð¸Ð· ÑÑÐ¸Ñ roots, ÑнаÑала Ð½Ð°Ñ Ð¾Ð´Ñ Ð²Ñе обÑекÑÑ, на коÑоÑÑе еÑÑÑ ÑÑÑлки из roots, заÑем вÑе обÑекÑÑ, на коÑоÑÑе еÑÑÑ ÑÑÑлки из найденнÑÑ Ð¸ Ñак далее. СÑаÑÑÑÑ Ð¸Ð· roots, ÑбоÑÑик мÑÑоÑа, Ñаким обÑазом, Ð½Ð°Ñ Ð¾Ð´Ð¸Ñ Ð²Ñе доÑÑÑпнÑе обÑекÑÑ Ð¸ ÑниÑÑÐ¾Ð¶Ð°ÐµÑ Ð½ÐµÐ´Ð¾ÑÑÑпнÑе.
ÐаннÑй алгоÑиÑм лÑÑÑе пÑедÑдÑÑего, поÑколÑÐºÑ "Ð½Ð¾Ð»Ñ ÑÑÑлок на обÑекÑ" вÑегда Ð²Ñ Ð¾Ð´Ð¸Ñ Ð² понÑÑие "обÑÐµÐºÑ Ð½ÐµÐ´Ð¾ÑÑÑпен". ÐбÑаÑное же - невеÑно, как Ð¼Ñ ÑолÑко ÑÑо видели вÑÑе на пÑимеÑе ÑиклиÑеÑÐºÐ¸Ñ ÑÑÑлок.
ÐаÑÐ¸Ð½Ð°Ñ Ñ 2012 года, вÑе ÑовÑеменнÑе веб-бÑаÑзеÑÑ Ð¾ÑнаÑаÑÑÑÑ ÑбоÑÑиками мÑÑоÑа, ÑабоÑаÑÑими иÑклÑÑиÑелÑно по пÑинÑÐ¸Ð¿Ñ mark-and-sweep ("помеÑÑ Ð¸ вÑбÑоÑи"). ÐÑе ÑÑовеÑÑенÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² облаÑÑи ÑбоÑки мÑÑоÑа в инÑеÑпÑеÑаÑоÑÐ°Ñ JavaScript (генеалогиÑеÑкаÑ/инкÑеменÑалÑнаÑ/конкÑÑенÑнаÑ/паÑаллелÑÐ½Ð°Ñ ÑбоÑка мÑÑоÑа) за поÑледние неÑколÑко Ð»ÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ñобой ÑÑовеÑÑенÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ алгоÑиÑма, но не новÑе алгоÑиÑÐ¼Ñ ÑбоÑки мÑÑоÑа, поÑколÑÐºÑ Ð´Ð°Ð»ÑнейÑее ÑÑжение понÑÑÐ¸Ñ "обÑÐµÐºÑ Ð±Ð¾Ð»ÐµÐµ не нÑжен" не пÑедÑÑавлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм.
ТепеÑÑ ÑиклиÑеÑкие ÑÑÑлки - не пÑоблемаРвÑÑепÑиведÑнном пеÑвом пÑимеÑе поÑле возвÑаÑа из ÑÑнкÑии оба обÑекÑа не имеÑÑ Ð½Ð° ÑÐµÐ±Ñ Ð½Ð¸ÐºÐ°ÐºÐ¸Ñ ÑÑÑлок, доÑÑÑпнÑÑ Ð¸Ð· глобалÑного обÑекÑа. СооÑвеÑÑÑвенно, ÑбоÑÑик мÑÑоÑа помеÑÐ¸Ñ Ð¸Ñ ÐºÐ°Ðº недоÑÑÑпнÑе и заÑем ÑдалиÑ.
То же Ñамое каÑаеÑÑÑ Ð¸ вÑоÑого пÑимеÑа. Ðак ÑолÑко div и его обÑабоÑÑик ÑÑанÑÑ Ð½ÐµÐ´Ð¾ÑÑÑÐ¿Ð½Ñ Ð¸Ð· roots, они оба бÑдÑÑ ÑниÑÑÐ¾Ð¶ÐµÐ½Ñ ÑбоÑÑиком мÑÑоÑа, неÑмоÑÑÑ Ð½Ð° налиÑие ÑиклиÑеÑÐºÐ¸Ñ ÑÑÑлок дÑÑг на дÑÑга.
ÐгÑаниÑение: некоÑоÑÑе обÑекÑÑ Ð½ÑждаÑÑÑÑ Ð² Ñвном пÑизнаке недоÑÑÑпноÑÑиХоÑÑ ÑÑÐ¾Ñ ÑаÑÑнÑй ÑлÑÑай и ÑаÑÑениваеÑÑÑ, как огÑаниÑение, но на пÑакÑике он вÑÑÑеÑаеÑÑÑ ÐºÑайне Ñедко, поÑÑомÑ, в болÑÑинÑÑве ÑлÑÑаев, вам не нÑжно беÑпокоиÑÑÑÑ Ð¾ ÑбоÑке мÑÑоÑа.
СмоÑÑиÑе ÑакжеRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4