Так ли обязательна самовызывающая анонимная функция?
Разбираюсь с основами ООП в js. Довольно часто натыкаюсь на имитацию классов при помощи самовызывающейся анонимной функции, например вот так:
(function (window) { window.ballName = "Ball"; function Ball(size, weight){ this.size = size; this.weight = weight; this.init(); } Ball.prototype = Object.create(Circle); //Наследуем свойства от Circle Ball.prototype.init = function(){ } window.Ball = Ball; }(window)); Вот и возникает вопрос, а так ли необходима сама эта анонимная функция? Не проще ли сделать вот так? var ballName = "Ball"; function Ball(size, weight) { this.size = size; this.weight = weight; this.init(); } Ball.prototype = Object.create(Circle); //Наследуем свойства от Circle Ball.prototype.init = function(){ }; Существует ли принципиальная разница между этими двумя записями? И если да, то какая? |
Это никакая не имитация классов, а обычное замыкание, чтобы в глобал не попали ненужные там переменные и функции
(function () { var privateVariable = true; typeof privateVariable //→ "boolean" }()); typeof privateVariable //→ "undefined" можно еще так new function () { var privateVariable = true; typeof privateVariable //→ "boolean" }; typeof privateVariable //→ "undefined" |
Т.е. разница будет лишь в том что если я захочу создать "приватную" переменную, которая не должна попасть в глобальную область видимости - я не смогу сделать этого во втором варианте записи?
|
да
|
Можно вас попросить почитать комментарии в коде? Я всё правильно понял?
(function (window) { //Window можно и не передавать, но тогда к нему нельзя будет обратится в локальных функциях //Здесь можем записывать публичные переменные, window === this в данном случае window.foo = 2; this.bar = 3; //Также можем создавать "статические" переменные, вешая их непосредственно на функцию Ball.STATIC_VAR = "staticVar"; //Здесь можем записывать "приватные" переменные, которые нужны для функционирования данного класса, но не должны попасть в global var ballName; // Данная переменная будет доступна только для функций данной области видимости var ballSize = 25; //После того как функция выполнится - все переменные в этом блоке будут уничтожены //---------------------------- function Ball(size, weight){ this.size = size; this.weight = weight; window.ballName2 = "Tree"; ballName = "Ball2"; this.init(); } Ball.prototype = Object.create(Circle); //Наследуем свойства от Circle Ball.prototype.init = function(){ console.log(ballName2); } window.Ball = Ball; }(window)); |
Цитата:
var namespace = {}; namespace.property = value; в данном случает namespace = window var namespace = window; namespace.property = value; window.property == value // → true то есть мы сможем поменять namespace, как захотим, и не придется во всем коде переписывать его название: (function (namespace) { namespace.property = value; }(window)); //или (function (namespace) { namespace.property = value; }(otherObject));поменялся только аргумент функции, в теле ничего менять не пришлось Цитата:
|
Цитата:
Цитата:
|
да, замыкание никак не влияет на доступность глобальных переменных, если только внутри не создать локальную с тем же именем
|
Часовой пояс GMT +3, время: 19:21. |