четверг, 24 февраля 2011 г.

Что является this в функции

Чтобы дать исчерпывающий ответ на этот вопрос приведу следующий пример:

var myFunc = function(){
  console.log(this);
}

var myObj = new myFunc(); // тут myObj
myFunc();// тут window

Из этого примера следует, что если мы в методе обьекта вызываем функцию и она что-то присваивает в this, то это заносится в тело нашего обьекта.


Почему методы обьекта имеет доступ к приватным функциям класса?
Потому что у них хранится ссылка на эти функции. Имеено из-за существования этих функций сборщик не удаляет эти функции. Поскольку возле привата стоит var, то это означает, что переменную нужно хранить в обьекте Function, наш же обьект создан с помощью этой него. И такие ссылки не дадут почиститься памяти от вего этого обьекта, поскольку на его часть есть ссылка.

пример:
var myFunc = function(){
  var privateMeth = function(){alert("private");};
  return {
    publicMeth: function(){
      alert("public");
      privateMeth();//существование этой ссылки не дает сборщику удалить
    };
  }
}

var myObj = myFunc();

var myObj = new myFunc(); // тут myObj
myFunc();// тут window


И вот чудесный пример для размышлений:
var myFunc = function(){
  console.log("this in myFunc>");
  console.log(this);

  var private = function(){    
    console.log("this in private>");
    console.log(this);
  }
  private();
  this.public = function(){
      console.log("public method!");
      private();
  };
  
};

myFunc();

var myObj = new myFunc();
console.log(myObj);
myObj.public();

а вот результаты вывода:
this in myFunc>
Window
this in private>
Window
this in myFunc>
Object {}
this in private>
Window
Object {}
public method!
this in private>
Window

С этого примера видно, что приватный метод(var private) сохраняется в области Window. Даже если в нашем публичном методе сохраняется ссылка на этот метод, это не меняет тот факт, что приватный метод был создан, а значит и хранится в областе памяти Window.

Комментариев нет:

Отправить комментарий