JS, closures, native code functions

hwh2010

обнаружил странность в opera и firefox
этот код прекрасно работает:

<form action="javascript:alert('action');">
<input type=submit>
</form>
<script>
document.forms[0].submit;
document.forms[0].oldsubmit=document.forms[0].submit;
document.forms[0].submit=function{
alert('begin submit. submit is ...');
alert(this.oldsubmit);
try{
this.oldsubmit;
} catch(e){
alert('here we fail submit : '+e);
};
alert('... submit OK');
}
document.forms[0].submit;
</script>

а вот в этом работает только верхняя часть (которая про f). та, что про sumbit — валится

<script>
var f=function{alert('f');}
f;
var q=f;
f=function(qq){
return function{
alert('begin f. f is ...');
alert(qq);
try{
qq;
} catch(e){
alert('here we fail f : '+e);
};
alert('... f OK');
}
}(q);
f;
</script>

<form action="javascript:alert('action');">
<input type=submit>
</form>
<script>
document.forms[0].submit;
var q=document.forms[0].submit;
document.forms[0].submit=function(qq){
return function{
alert('begin submit. submit is ...');
alert(qq);
try{
qq;
} catch(e){
alert('here we fail submit: '+e);
};
alert('... submit OK');
}
}(q);
document.forms[0].submit;
</script>

вопрос: что я делаю некорректного и в какой спек глядеть?

Andbar

вопрос: что я делаю некорректного и в какой спек глядеть?
гм... Я плохо знаю JS, но ты вызываешь метод не передавая экземпляр класса, мб. в этом проблема?
upd: если вызов qq заменить на (вроде) эквивалентный код:
				var tmp = document.forms[0].submit;
document.forms[0].submit = qq;
document.forms[0].submit;
document.forms[0].submit = tmp;
то ошибка не проявляется

tokuchu


document.forms[0].submit=function(qq){
return function{
alert('begin submit. submit is ...');
alert(qq);
try{
qq;
} catch(e){
alert('here we fail submit: '+e);
};
alert('... submit OK');
}
}(q);

А зачем вообще обёртку из функции делать?
"function(A){return function{...A...}}(B)" не проще ли записать "function{...B...}"?

Bibi

вроде фабрики что-то, наверное (или как там оно называться должно?)
вообще, всем пишущим javascript, стоит прочитать вот это: http://ejohn.org/apps/learn/
(я пока еще не до конца дошел, но мозги в порядок приводит хорошо)

tokuchu

вроде фабрики что-то, наверное (или как там оно называться должно?)
Ну в данном случае, если этот сферический конь не специально сделан для эксперимента, то смысла в этой фабрике нет. :)

hwh2010

ты вызываешь метод не передавая экземпляр класса, мб. в этом проблема?
действительно. Спасибо

Andbar

Читаю текст по ссылке, которую дал
Выходит, что кусок кода из моего поста можно заменить на qq.call(document.forms[0]);

hwh2010

о, спасибо. А я что-то пытался мучиться с with

hwh2010

http://ejohn.org/apps/learn/
спасибо большое за ссылку. Сегодня не пошёл ни на работу, ни в универ :)
Оставить комментарий
Имя или ник:
Комментарий: