Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   хитросплетения Global,контекст,this,Reference (https://javascript.ru/forum/misc/3158-khitrospleteniya-global-kontekst-reference.html)

kefi 01.04.2009 10:23

Цитата:

Сообщение от Zeroglif
Даже не знаю, как объяснять

Это все понятно, спасибо. Но Вы не замечаете почему-то моего акцентирования на теле функции. Вы прямо не говорите - тело у всех функций одно сохраняется, [[Scope]] разный , а текст тела один ?

Zeroglif 01.04.2009 10:51

Цитата:

Сообщение от kefi
а текст тела один ?

Ну, конечно же.

Dmitry A. Soshnikov 01.04.2009 11:57

kefi, реализация может создавать объединённые объекты (join object's), тем самым, обеспечивая оптимизацию. Вот у таких объектов, тело (блок кода) будет использоваться одно, а внутренние свойства (включая [[scope]]) будут разделены.

Могу продемонстрировать на Python'e, если есть желание (там два одинаковых метода у двух созданных инстансов будут разные (False на ==), но внутреннее свойство функции этих методов - будет ссылаться на один и тот же блок кода (True на ==)).

kefi 10.04.2009 19:37

Вот еще пример, в котрый я не могу въехать :
function al(o){document.write(o,'<br>')} 
function Class2(arg1) {
	this._featureAction1=function(){ al(["Class2._featureAction1"])     }  ;
           this._featureAction1() ; // как и ожидалось вызывается метод объекта, на который показывает this, т.е. function(){ al(["Class2._featureAction1"])     }  ;
	//this.constructor.prototype._featureAction1.call(this);  
	this.constructor.prototype._featureAction1();  
};
Class2.prototype._featureAction1=function(){ 
	this._featureAction1();  // переполнение стека .
	//al(["Class2.prototype._featureAction1"])     
};
c=new Class2();

На строке "this._featureAction1(); // переполнение ... " происходит зацикливание(переполнение стека).
Хотя я ожидал , что this сработает так же как и в строке
" this._featureAction1() ; // как и ожидалось ..." , т.е. просто будет вызван как Собственый метод this.функция из тела Конструктора.

Почему же при вызове из тел функций прототипа работает иначе, чем из тела Конструктора ?

Zeroglif 10.04.2009 20:16

Цитата:

Сообщение от kefi
Почему же при вызове из тел функций прототипа работает иначе, чем из тела Конструктора ?

Разное значение 'this' - при вызове конструктора значением является создаваемый объект, при вызове второй функции значением 'this' является 'Class2.prototype'.

В js значение 'this' меняется динамически и зависит от контекста вызова (от того, каким образом вызывается функция). Вам нужно просто почитать про это.

kefi 10.04.2009 20:23

Цитата:

при вызове второй функции значением 'this' является 'Class2.prototype'.
Ну вот вроде как там где я читал написано, что значением this будет являться объект, а не прототип ...
Гдк сказано , что значением this в теле метода прототипа будет прототип ?

Zeroglif 10.04.2009 20:33

Цитата:

Сообщение от kefi
Гдк сказано , что значением this в теле метода прототипа будет прототип ?

Значение 'this' к телу не имеет никакого отношения, методы живут самостоятельно, никакой жёсткой связи с объектами, значение 'this' зависит только от вызова.

kefi 10.04.2009 23:08

А ну где читал , там не обращено внимание видно на то, что this в теле вызываемой функции укажет на "все, что стоит перед вызовом"
т.е. я подумал, что this внутри будет равен (this) :
(this).constructor.prototype._featureAction1()
а он на самом деле равен (this.constructor.prototype) :
(this.constructor.prototype)._featureAction1()

Dmitry A. Soshnikov 10.04.2009 23:33

Цитата:

Сообщение от kefi
что this в теле вызываемой функции укажет на "все, что стоит перед вызовом"

this может быть не определён, в этом случае его значением подставляется window.

И, кстати, не зависимо от того, есть ли у Вас собственный метод this._featureAction1 - всё равно будет зацикливанием (в этом случае this будет указывать на объект "с", но вызываться будет снова этот метод из прототипа).

kefi 12.04.2009 16:08

Может кто-нибудь понятно объяснить, что называют
- контекстом функции ;
- объектом переменных функции (VO) ;
- [[scope]] функции
?

Например для функции верхнего уровня F:
var I ;
function F() { var i;} ;
Говоря "контекст функции F" имеют ввиду глобальный код , в котором находится функция F с переменной I или же - ее внутренний код с переменной i ?
Говоря "[[scope]] функции F" - аналогичный вопрос, что имеют ввиду ?.
Говоря "VO функции F" - аналогичный вопрос , что имеют ввиду ?

Мне кажется , что порой эти понятия путаются (у меня в голове так точно, чтение стандарта не помогло ) ...


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