Сообщения

Сообщения за август, 2011

Коллизия нотации "(function)();" в JavaScript или почему JavaScript разработчик будет ставить точку с запятой перед (function)();

Нотацию (function)(); в JavaScript всегда надо начинать с точки с запятой. Это защитит от трудно определимой ошибки в интерпретации кода JavaScript-движком. Нотация ( function )(); в JavaScript чаще всего применяется в следующих случаях: когда вы хотите ограничить видимость локальных переменный и поиграть с замыканиями (closures), при этом вызывая немедленное выполнение. когда в проекте используется несколько JavaScript фреймворков и они бодаются за переменную по имени $. Эта нотация помогает гарантированно использовать переменную $, независимо от будущих изменений на сайте. Пример: ;( function ($) { /* do something*/ } )( jQuery ); Ниже код, объясняющий почему нужно использовать точку с запятой вначале. function f1(inp) { alert("f1 - " + inp); } // Ошибки не будет, все в порядке. var f2 = function (inp) { alert("f2 - " + inp); } ; (f1)("2"); // Если следующую строку не завершить точкой с запятой, будет ошибка. var f3 = function (in

Отличие создания свойств объекта в конструкторе и через прототип конструктора в JavaScript.

Свойства, задаваемые в конструкторе, нельзя подменять через прототип. Т.е. свойство задаваемое в конструкторе скрывает одноименное свойство в прототипе. Например, для конструктора function c() { this.a = "a"; } запись c.prototype.a = "a2"; не имеет смысла (если не обращаться из объекта реализации напрямую, например myObj.constructor.prototype.a ) . Далее JavaScript код для просмотра в дебаггинге. Здесь метод  assert никогда не будет выполнен . var assert = function (res) { if (res !== true) alert("false"); } function c() { this.a = "a"; } c.prototype.b = "b"; var t1 = new c(); c.prototype.a = "a2"; c.prototype.b = "b2"; var t2 = new c(); assert(t1.a == t2.a); assert(t1.a == "a"); assert(t1.b == t2.b); assert(t1.b == "b2");