Аргументы по умолчанию в JS и вызов пользовательской ф-ции

akxxiv

Новичок
Аргументы по умолчанию в JS и вызов пользовательской ф-ции

Вопрос такой. Точнее два вопроса.
1. в РНР можно в функции указать значения по умолчанию, напр function ($a=null). А что-то подобное в JS можно сделать? Если да то как?

2. Есть ли в JS аналог РНР-шной call_user_func(). Если в eval не залезать.
 

Major

Новичок
1. в РНР можно в функции указать значения по умолчанию, напр function ($a=null). А что-то подобное в JS можно сделать? Если да то как?
PHP:
<script type="text/javascript">
function foo( $a, $b )
{
        $a  = $a || "default a";
        $b  = $b || "default b";

       alert( $a + "\n" + $b );
}

foo( 'test' );

</script>
 

akxxiv

Новичок
Есть еще один вопрос для тех кто знаком с ООП в JS вообще и JsHttpRequest в частности


Уже сломал голову, ни как не могу придумать как же заставить работать JsHttpRequest в рамках объекта? Что я имею в виду.
Вот примерный код Код (JavaScript): скопировать код в буфер обмена
PHP:
function tree (contaner, objName)
{
        this.req = new JsHttpRequest;
}

tree.prototype = {
// Тут всякие переменные, среди которых
        req: null,
        reload: function()
                {
                        // Здесь вытасиваем из базы данные и передаем их функции построения дерева текущего объект
                        this.req.onreadystatechange = this.createTree;
                        this.req.open(null, 'load.htm', true);
                        this.req.caching = false;
                        this.req.send( { 'level': 1 } );
                        
                },

        createTree: function()
                {
                        // А вот сдесь вываливается ошибка что this.req пуст ???
                        if(this.req.readyState == 4)
                        {
                                var errors = this.req.responseText;
                                var arr = this.req.responseJS;
                                
                                if(errors) return esa_error(errors);        
                        
                                alert(this.objName);
                        
                                var str = this.treePrepare(arr);
                        
                                $("#tree_loader").remove();
                        
                                this.contaner.append(str);                
                        }        
                },


}

tree = new esa_tree("treeIsHere", "tree");
tree.reload();
Вот все рабоатает до того, как функция tree.reload() передает в качестве колбэк функции JsHttpRequest метод this.createTree. И тут все. при вызове данного метода как будто все свойства объекта стираются. И this.req пустой и другие свойств, установленные до вызова так же недоступны. Как будто вызывается метод createTree не для оьъекта tree а для чего-то еще.

Помогите пожалуйста разобраться. Как сделать так чтобы все работало в рамках одного объекта ?

Уже не знаю с какой стороны подойти. Думаю уже плюнуть на объекты и пойти процедурным путем. Или вызывать JsHttpRequest через модальное окно (благо приложение для IE) но очень бы этого не хотелось.

На форуме dklab я задал этот вопрос, но там так долго отвечают, решил продублировать здесь. Думаю будет продуктивней. Извиняюсь если что не так.
 

dimagolov

Новичок
Все очень просто. Ф-ии, которые используюься как call-back вызываются не в контексте объекта, а в контексте window. то есть this указывает не на объект, а на window. Хотя нет.... в данном конкретном случае так как callback это свойство req, то и контекстом будет req. Свою ошибку не правил а дописал правильный варианте для того, чтобы было более понятно что такое контекст ф-ии.
Какой выход? Замыкание, а именно:
PHP:
var t= this;
this.req.onreadystatechange= function () { t.createTree(); };
 

akxxiv

Новичок
Огромнейшее спасибо за просветление!!!

-~{}~ 17.12.07 11:40:

Еще один вопрос на эту тему. Есть ли JS аналогия
PHP:
foreach($arr as $key=>$value)
Или способ добиться для элемента хэша разбить его на ключ и значение???
 

dark-demon

d(^-^)b
for( $key in $hash ) ...

но с прототайпом так не получится... :) с ним нужно использовать метод forEach емнип
 

dimagolov

Новичок
akxxiv
повторюсь то что говорил в соседней теме.
не нужно писать на JS как на PHP. JS умеет такое, что PHP и не снилось, но не умеет более чем банальных умений PHP.

к вопросу о foreach. в JS проблематично получить массив с неизвестными ключами или объект с неизвестными свойствами. так что в большинстве случаев подобное там просто не нужно. Все коллекции возвращают индексированные массивы. Даже такие коллекции как frames доступны как по имени фрейма, так и по числовому интексу. Если мы знаем, кто нам нужен по имени, то можем обратиться просто по имени. А если надо перебрать всех и имена по барабану - обращаемся по числовому индексу. И никакого foreach не нужно.
 
Сверху