Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   область видимости неименованного экземпляра (https://javascript.ru/forum/events/59149-oblast-vidimosti-neimenovannogo-ehkzemplyara.html)

kuzroman 29.10.2015 20:16

область видимости неименованного экземпляра
 
Всем привет, вопрос знатокам.

function Rabbit() {
  this.p = 1;
}
new Rabbit();

скажите где в таком случае находится экземпляр объекта?
в глобальной области? можно ли к нему получить доступ?

а если он в функции? например:
function () { new Rabbit(); }

в этом случае где js хранит экземпляр, в скопе? Как опять же получить доступ?
В смысле, обязательно ли именовать созданный экземпляр, есть ли практика создания неименованных экземпляров?

Rise 29.10.2015 21:10

kuzroman, нигде не сохраняется.

kuzroman 29.10.2015 21:43

Цитата:

Сообщение от Rise (Сообщение 393639)
kuzroman, нигде не сохраняется.

Ну а если вот так сделать?
function Timer() {
    this.showTime = function () {
        setInterval(function () { console.log(1); },1000);
    }();
}

new Timer();

Он же тикает, это что, неконтролируемые данные?

Rise 29.10.2015 21:57

kuzroman, это setInterval почитайте что это такое.

kuzroman 29.10.2015 22:34

Rise,
Не, тут что то есть)
асинхронный код живет в объекте и я могу обращаться к приватным свойствам через замыкание
Например:
function Timer() {
    var a = 1;
    this.showTime = function () {
        setInterval(function () { console.log(a++) },1000);
    }();
}
new Timer();

Объекта нет, а скоуп его есть, является ли это неправильным кодом вызывающем утечку?

Rise 29.10.2015 22:56

kuzroman, нет здесь объекта - он умер, осталась лишь локальная переменная a в замыкании.

kuzroman 29.10.2015 23:05

Rise,
Хорошо, есть ли правила запрещающие нам создавать экземпляр таким образом (без ссылки) или мы вправе так делать, в случае необходимости?

Rise 29.10.2015 23:19

kuzroman, в данном примере нет необходимости создавать экземпляр, тоже самое:
function Timer() {
    var a = 1;
    setInterval(function () { console.log(a++) },1000);
}
Timer();

или
function Timer(a) {
    setInterval(function () { console.log(a++) },1000);
}
Timer(1);

или
(function (a) {
    setInterval(function () { console.log(a++) },1000);
}(1));

kuzroman 29.10.2015 23:43

Rise,
Да я согласен, это я так, частный случай, привел.
У меня слушатель сидит в экземпляре и наблюдает, тоже, просто, асинхронная вещь, вот и пример привел.


Часовой пояс GMT +3, время: 21:03.