Чтобы дать исчерпывающий ответ на этот вопрос приведу следующий пример:
Из этого примера следует, что если мы в методе обьекта вызываем функцию и она что-то присваивает в this, то это заносится в тело нашего обьекта.
Почему методы обьекта имеет доступ к приватным функциям класса?
Потому что у них хранится ссылка на эти функции. Имеено из-за существования этих функций сборщик не удаляет эти функции. Поскольку возле привата стоит var, то это означает, что переменную нужно хранить в обьекте Function, наш же обьект создан с помощью этой него. И такие ссылки не дадут почиститься памяти от вего этого обьекта, поскольку на его часть есть ссылка.
пример:
И вот чудесный пример для размышлений:
а вот результаты вывода:
С этого примера видно, что приватный метод(var private) сохраняется в области Window. Даже если в нашем публичном методе сохраняется ссылка на этот метод, это не меняет тот факт, что приватный метод был создан, а значит и хранится в областе памяти Window.
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.
Комментариев нет:
Отправить комментарий