Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 01.04.2009, 10:23
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

Сообщение от Zeroglif
Даже не знаю, как объяснять
Это все понятно, спасибо. Но Вы не замечаете почему-то моего акцентирования на теле функции. Вы прямо не говорите - тело у всех функций одно сохраняется, [[Scope]] разный , а текст тела один ?
Ответить с цитированием
  #32 (permalink)  
Старый 01.04.2009, 10:51
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от kefi
а текст тела один ?
Ну, конечно же.
Ответить с цитированием
  #33 (permalink)  
Старый 01.04.2009, 11:57
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

Могу продемонстрировать на Python'e, если есть желание (там два одинаковых метода у двух созданных инстансов будут разные (False на ==), но внутреннее свойство функции этих методов - будет ссылаться на один и тот же блок кода (True на ==)).
__________________
Тонкости ECMAScript
Ответить с цитированием
  #34 (permalink)  
Старый 10.04.2009, 19:37
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

Вот еще пример, в котрый я не могу въехать :
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.функция из тела Конструктора.

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

Последний раз редактировалось kefi, 10.04.2009 в 19:43.
Ответить с цитированием
  #35 (permalink)  
Старый 10.04.2009, 20:16
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

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

В js значение 'this' меняется динамически и зависит от контекста вызова (от того, каким образом вызывается функция). Вам нужно просто почитать про это.
Ответить с цитированием
  #36 (permalink)  
Старый 10.04.2009, 20:23
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

Цитата:
при вызове второй функции значением 'this' является 'Class2.prototype'.
Ну вот вроде как там где я читал написано, что значением this будет являться объект, а не прототип ...
Гдк сказано , что значением this в теле метода прототипа будет прототип ?
Ответить с цитированием
  #37 (permalink)  
Старый 10.04.2009, 20:33
...
Отправить личное сообщение для Zeroglif Посмотреть профиль Найти все сообщения от Zeroglif
 
Регистрация: 09.03.2008
Сообщений: 216

Сообщение от kefi
Гдк сказано , что значением this в теле метода прототипа будет прототип ?
Значение 'this' к телу не имеет никакого отношения, методы живут самостоятельно, никакой жёсткой связи с объектами, значение 'this' зависит только от вызова.
Ответить с цитированием
  #38 (permalink)  
Старый 10.04.2009, 23:08
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

А ну где читал , там не обращено внимание видно на то, что this в теле вызываемой функции укажет на "все, что стоит перед вызовом"
т.е. я подумал, что this внутри будет равен (this) :
(this).constructor.prototype._featureAction1()
а он на самом деле равен (this.constructor.prototype) :
(this.constructor.prototype)._featureAction1()
Ответить с цитированием
  #39 (permalink)  
Старый 10.04.2009, 23:33
Профессор
Отправить личное сообщение для Dmitry A. Soshnikov Посмотреть профиль Найти все сообщения от Dmitry A. Soshnikov
 
Регистрация: 25.02.2008
Сообщений: 707

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

И, кстати, не зависимо от того, есть ли у Вас собственный метод this._featureAction1 - всё равно будет зацикливанием (в этом случае this будет указывать на объект "с", но вызываться будет снова этот метод из прототипа).
__________________
Тонкости ECMAScript
Ответить с цитированием
  #40 (permalink)  
Старый 12.04.2009, 16:08
Кандидат Javascript-наук
Отправить личное сообщение для kefi Посмотреть профиль Найти все сообщения от kefi
 
Регистрация: 12.03.2009
Сообщений: 148

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

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

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

Последний раз редактировалось kefi, 12.04.2009 в 16:10.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск