Показать сообщение отдельно
  #2 (permalink)  
Старый 16.11.2011, 01:39
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

Функции и конструкторы в javaScript по сути все безымянны, когда мы создаём функцию, мы обычно создаём ещё и ссылку на функцию И имеем дело в дальнейшем с именами переменных ссылок, но ни как не с именами функций или конструторов.

a=function(x,y){
        alert(x+y);
    }
    b=a; //дадим функции имя b
    c=a; //дадим функции имя c
    
    a(1,1); // вызовем функцию с именем а

    delete a; // УДАЛИМ первое имя функции

    b(1,2); // второе имя функции (работает несмотря на то что первое имя исчезло)
    c(2,3); // третье имя функции (работает несмотря на то что первое имя исчезло)


Декларативная запись даст тот же эффект.

function a(x,y){
        alert(x+y);
    }
    b=a; //дадим функции имя b
    c=a; //дадим функции имя c
    
    a(1,1); // вызовем функцию с именем а

    delete a; // УДАЛИМ первое имя функции

    b(1,2); // второе имя функции (работает несмотря на то что первое имя исчезло)
    c(2,3); // третье имя функции (работает несмотря на то что первое имя исчезло)


уневерсальный метод меняющий "имя функции" в обьекте context.

// метод
function changeName (context,oldname,newname) {
        context[newname]=context[oldname];
        delete context[oldname]; // удаляем старое имя из обьекта
}

// проверка
test={
     functest: function(){
         alert ("привет");
     }
};

// заменим старое имя functest, на новое testNewName
changeName(test, "functest", "testNewName");

// обратимся к функции по новому имени
test.testNewName();


функция даже сама может поменять своё имя, а при необходимости даже самоликвидироваться, унечтожив последнюю ссылку на себя.
test={
     functest: function(){
         alert ("привет");
         // если мы ещё не меняли то поменяем имя функции      
         if (this.functest) {
               this["newnamefunc"]=this.functest;
               delete this.functest; // удалим старое имя функции
         }
                
     }
}

// обратимся к функции, функция сменит своё имя
test.functest();

// обратимся к функции по новому имени
test.newnamefunc();

// попробуем обратится по старому имени, и получим ошибку
test.functest();
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 16.11.2011 в 02:50.
Ответить с цитированием