Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Переписать из вне функцию, находящуюся внутри другой функции (https://javascript.ru/forum/misc/16602-perepisat-iz-vne-funkciyu-nakhodyashhuyusya-vnutri-drugojj-funkcii.html)

балерун 14.04.2011 12:55

Переписать из вне функцию, находящуюся внутри другой функции
 
Привет, есть код вроде такого:
obj.original = functin()
{
    function oldCompute(){}; // Оригинальная функция, поведение которой надо изменить
    function other1(){};
    function other2(){};
    return /* Какие-то вычисления с использованием этих функций */;
}


Можно ли как-нибудь изменить поведение функции oldCompute, не влезая в исходный код? Перезаписать/заменить ее своей функцией?

"Извне" слитно пишется. Ошибся :(

Skipp 14.04.2011 13:02

в вашем случаи функция oldCompute глобальная и к ней обратиться можно откуда угодно, так же и изменить
просто переопределите её ниже и всё

балерун 14.04.2011 13:08

Ой, щас я допишу, что б было яснее :)

В первом скрипте к глобальному объекту (jquery, что уж там скрывать) дописывается один метод (original). И этот скрипт мне не хочется менять. Следом я подключаю свой скрипт, когда уже у jquery есть метод original. Как мне можно изменить заменить oldCompute? Может быть я сильно торможу, заранее сорри, если так :)

Цитата:

Сообщение от Skipp (Сообщение 100638)
в вашем случаи функция oldCompute глобальная и к ней обратиться можно откуда угодно, так же и изменить
просто переопределите её ниже и всё

Можно пример?

балерун 15.04.2011 10:29

Если это невозможно, то так и скажите, но не томите)

Skipp 15.04.2011 10:32

function f(){
 return 1;
}
function f(){
 return 2;
}

alert(f());

Skipp 15.04.2011 10:36

var obj= {};
obj.original = function()
{
    function oldCompute(){ return "Я глобальная функция хоть и в теле другой и всем пофиг где я лежу"; }
    function other1(){}
    function other2(){}

}


function oldCompute(){ return "Надо всего лишь попробовать."; }
alert(oldCompute());

балерун 15.04.2011 11:46

var obj= {};
obj.original = function()
{
    function oldCompute(){ return "Я глобальная функция хоть и в теле другой и всем пофиг где я лежу"; }
    function other1(){return "other1"; }
    function other2(){return "other2"; }
    return oldCompute() + "\n" + other1() + "\n" + other2();
}


function oldCompute(){ return "Надо всего лишь попробовать."; }
alert(oldCompute());
alert(obj.original()); // :(

Последний алерт вернул не то, что надо (первоначальный код функции).
Поправьте, если не прав, но не получится изменить результат выполнения obj.original(), т.к. функция oldCompute() находится во внутренней области видимости. Просто, я надеялся, что может быть я что-то не до конца знаю.

B@rmaley.e><e 15.04.2011 12:35

Цитата:

Сообщение от Skipp
в вашем случаи функция oldCompute глобальная

Неправда.
original = function(){
    function oldCompute(){};
    return 1;
}

alert(typeof oldCompute);
original(); // ладно, может появится после вызова
alert(typeof oldCompute);

Skipp 15.04.2011 12:35

балерун,
ну понятное дело, так как в этой функции идёт обьявление другой.
obj.original = function(){
// А это переопределить нельзя?
}


var obj= {};
obj.original = function()
{
    function oldCompute(){ return "Я глобальная функция хоть и в теле другой и всем пофиг где я лежу"; }
    function other1(){return "other1"; }
    function other2(){return "other2"; }
    return oldCompute() + "\n" + other1() + "\n" + other2();
}


function oldCompute(){ return "Надо всего лишь попробовать."; }
alert(obj.original());
obj.original = function()
{
    function oldCompute(){ return "Надо всего лишь попробовать 2."; }
    function other1(){return "other1"; }
    function other2(){return "other2"; }
    return oldCompute() + "\n" + other1() + "\n" + other2();
}
alert(obj.original());

Skipp 15.04.2011 12:40

Цитата:

Сообщение от B@rmaley.e><e
Неправда.

ну это по-тому, что она не была объявлена, а так-то она глобальная:)
кстати оба алерта undefined O_o
А так работает:
original = function(){
    oldCompute = function(){};
    return 1;
}

alert(typeof oldCompute);
original(); // ладно, может появится после вызова
alert(typeof oldCompute);


Часовой пояс GMT +3, время: 20:26.