ПредишенСледващото

1. Правилно използване това, когато се работи с приспособление за затваряне

Резултати в грешка:

Защо се случва това? Цялата работа в контекст. Когато се обадите на setTimeout (), той всъщност причинява window.setTimeout (). В резултат на това анонимна функция предава setTimeout (), се определя в контекста на прозореца на обект, който не е метод clearBoard ().

Традиционното решение, което е съвместимо с по-стари браузъри, включва една проста справка за запазването на тази променлива, която може да се съхранява в затварянето:

свързват () метод може да се използва за новия браузър, който позволява да се свърже с функция контекста на изпълнение:

3. изтичане на памет

изтичане на памет са практически неизбежни, ако по време на работа, че няма да съзнателно да ги избягвате. Има много причини за появата на течове, но ние ще се съсредоточи само върху най-често.

Връзки към несъществуващи обекти

Нека да анализираме този код:

Ако се сблъскате с кода за изпълнение, ще намерите огромен теч памет със скорост от около мегабайт в секунда. Изглежда, че ние губим паметта разпределени за longStr на всеки replaceThing повикване. Каква е причината?

Типичен начин за осъществяване на вина - е да се създаде връзка между всяка функция обект и речника обект, който е лексикален обхват за тази функция. Ако и двете функции (неизползван и someMethod), определен vnutrireplaceThing действително използвани priorThing, важно е да се разбере, че те са един и същ обект, дори ако priorThing пренаписан отново и отново, тъй като и двете функции използват една и съща лексикален обхват. И веднага след като променливата се използва във всеки един от затварянето, то попада в обхвата на лексикалната използва от всички вериги в този обхват. И този малък нюанс води до мощно изтичане на паметта.

кръгови препратки

Вземем примера на код:

  • връзки, предвидени в набора от повикване (всички локални променливи и параметри на функциите, които в момента се наричат, както и всички променливи във веригата на зрението);
  • всички глобални променливи.

Обектите, съхранени в паметта само толкова дълго, колкото на разположение от корена на връзката на веригата или връзки.

Събирачът на браузъра, който изчиства паметта на недостъпни обекти. Това означава, че обектът ще бъде изтрит от паметта само когато събирачът реши, че е недостижим. За съжаление, това съвсем спокойно може да се натрупват неизползвани големи обекти, които се считат за "постижима".

4. Липса на разбиране за равенство

Както дадения пример две автоматични тип реализация понякога може да се намеси. Обикновено по-добре да се използва === и! == вместо == и! = За да се избегнат страничните ефекти на видовете реализация.

Между другото, сравнението с NaN нищо (дори NaN!) Винаги ще доведе до неверни. По този начин, не е възможно да се използва операторът на равенство (==, ===. =. ==), за да се определи съответствие стойности NaN. Вместо това, използвайте функцията вградена глобална isNaN ():

5. използван правилно DOM

Ако искате да добавите няколко позиции, а след това, като алтернатива, можете да използвате части от документа:

6. Правилно използване на функционални дефиниции в продължение на електрически вериги

Вземем примера на код:

Когато кликнете върху някоя от 10-те елементи ще се появи съобщение "Това е елемент # 10" Причината е, че от момента, в който OnClick причинени от някоя от елементите за по-висока цикъл е завършен, а стойността на I е равна на 10.

Един пример за правилен код:

makeHandler веднага се движат по всяка итерация на цикъла, получава текущата стойност на I + 1 и го съхранява в променлива бр. Външният функцията връща вътрешния функция (която също използва променлива Num на) и го определя като OnClick манипулатор. Това гарантира, че всеки OnClick получава и използва правилната стойност на аз.

7. Правилно наследство чрез създаване на прототипи

Изненадващо много фирми не разполагат с ясно разбиране на механизма на наследяване чрез създаване на прототипи. Вземем примера на код:

Но ако е написал това:

Но не е ли по-добре да се върне стойност по подразбиране? Това може лесно да се направи, ако се прилагат наследство чрез прототип:

Всяка инстанция BaseObject наследява името собственост на прототипа, в която той е зададен по подразбиране. По този начин, ако строителят се нарича без име, svoystvoname по подразбиране ще изпълни задълженията си. По същия начин, ако името на имот ще бъде изтрит от инстанция BaseObject, се извършва търсене на namebudet прототип верига и имущество, получено от прототипа на обекта, в който тя все още е равна на стандартната:

8. Създаване на точни препратки към методи инстанция

Ние определяме един прост конструктор и да го използвате се създаде обект:

За удобство, да се правят препратки към метод Whoami:

Ние се получи стойността на нашата нова променлива Whoami:

Конзолата ще се появи:

Сега обърнете внимание на разликата в разговори obj.whoAmI () и Whoami ():

Какво се обърка? Когато зададете Var Whoami = obj.whoAmI;, нова променлива се определя в глобалното пространство. В резултат на това тази стойност е включена ravnymwindow отколкото OBJ, копие на MyObject. По този начин, ако наистина искате да създадете връзка към съществуващ метод обект, трябва да го направите в рамките на пространството на имената на обекта. Например:

9. Използвайте низ като първи аргумент на setTimeout или setInterval

Това само по себе си не е грешка. И това не е само в представянето си. Факт е, че когато премине низ променлива като първи аргумент на setTimeout или setInterval, той ще бъде прехвърлена към функцията на конструктор за преминаване към нова функция. Този процес може да бъде бавен и неефективен. Една алтернатива е да се използва функция като първи аргумент:

10. Ако не използвате една «строг режим»

Този режим, който налага редица ограничения върху изпълнимия код, който повишава сигурността и да предотврати появата на някои грешки. Разбира се, като се избягва употребата на "строг режим" не е грешка като такива. Само в случай, вие сте сами лишава от редица предимства:

Свързани статии

Подкрепете проекта - споделете линка, благодаря!