01.04.2009, 10:23
|
Кандидат Javascript-наук
|
|
Регистрация: 12.03.2009
Сообщений: 148
|
|
Сообщение от Zeroglif
|
Даже не знаю, как объяснять
|
Это все понятно, спасибо. Но Вы не замечаете почему-то моего акцентирования на теле функции. Вы прямо не говорите - тело у всех функций одно сохраняется, [[Scope]] разный , а текст тела один ?
|
|
01.04.2009, 10:51
|
...
|
|
Регистрация: 09.03.2008
Сообщений: 216
|
|
Сообщение от kefi
|
а текст тела один ?
|
Ну, конечно же.
|
|
01.04.2009, 11:57
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
kefi, реализация может создавать объединённые объекты (join object's), тем самым, обеспечивая оптимизацию. Вот у таких объектов, тело (блок кода) будет использоваться одно, а внутренние свойства (включая [[scope]]) будут разделены.
Могу продемонстрировать на Python'e, если есть желание (там два одинаковых метода у двух созданных инстансов будут разные (False на ==), но внутреннее свойство функции этих методов - будет ссылаться на один и тот же блок кода (True на ==)).
|
|
10.04.2009, 19:37
|
Кандидат Javascript-наук
|
|
Регистрация: 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.
|
|
10.04.2009, 20:16
|
...
|
|
Регистрация: 09.03.2008
Сообщений: 216
|
|
Сообщение от kefi
|
Почему же при вызове из тел функций прототипа работает иначе, чем из тела Конструктора ?
|
Разное значение 'this' - при вызове конструктора значением является создаваемый объект, при вызове второй функции значением 'this' является 'Class2.prototype'.
В js значение 'this' меняется динамически и зависит от контекста вызова (от того, каким образом вызывается функция). Вам нужно просто почитать про это.
|
|
10.04.2009, 20:23
|
Кандидат Javascript-наук
|
|
Регистрация: 12.03.2009
Сообщений: 148
|
|
Цитата:
|
при вызове второй функции значением 'this' является 'Class2.prototype'.
|
Ну вот вроде как там где я читал написано, что значением this будет являться объект, а не прототип ...
Гдк сказано , что значением this в теле метода прототипа будет прототип ?
|
|
10.04.2009, 20:33
|
...
|
|
Регистрация: 09.03.2008
Сообщений: 216
|
|
Сообщение от kefi
|
Гдк сказано , что значением this в теле метода прототипа будет прототип ?
|
Значение 'this' к телу не имеет никакого отношения, методы живут самостоятельно, никакой жёсткой связи с объектами, значение 'this' зависит только от вызова.
|
|
10.04.2009, 23:08
|
Кандидат Javascript-наук
|
|
Регистрация: 12.03.2009
Сообщений: 148
|
|
А ну где читал , там не обращено внимание видно на то, что this в теле вызываемой функции укажет на "все, что стоит перед вызовом"
т.е. я подумал, что this внутри будет равен (this) :
(this).constructor.prototype._featureAction1()
а он на самом деле равен (this.constructor.prototype) :
(this.constructor.prototype)._featureAction1()
|
|
10.04.2009, 23:33
|
Профессор
|
|
Регистрация: 25.02.2008
Сообщений: 707
|
|
Сообщение от kefi
|
что this в теле вызываемой функции укажет на "все, что стоит перед вызовом"
|
this может быть не определён, в этом случае его значением подставляется window.
И, кстати, не зависимо от того, есть ли у Вас собственный метод this._featureAction1 - всё равно будет зацикливанием (в этом случае this будет указывать на объект "с", но вызываться будет снова этот метод из прототипа).
|
|
12.04.2009, 16:08
|
Кандидат Javascript-наук
|
|
Регистрация: 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.
|
|
|
|