Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Функция внутри анонимной функции (https://javascript.ru/forum/misc/55183-funkciya-vnutri-anonimnojj-funkcii.html)

igorz 16.04.2015 18:34

Функция внутри анонимной функции
 
Здравствуйте,
пишу себе вот так:
(function () {
    function main() {
        $(document).ready(function () {
            $('#testHref').attr('onclick', 'second(); return false;');
            console.log($('#testHref').attr('onclick'));
        });
    }
    main();

    function second() {
        console.log("second message");
    }
})();

function test() {
    console.log("Test message");
}


Получается так, что у меня изначально на мой #testHref привязана функция test() - работает.
Далее, нахожу idшник #testHref и к нему привязываю 'second(); return false;'
Проверяю через вывод в консоль - да, привязало.
Но и конечно в итоге получаю при нажатии что 'second is not defined'.
Подскажите, пожалуйста, как правильно стоит проделывать то что я пытаюсь ?
Спасибо!

nikita.mmf 16.04.2015 19:04

$('#testHref').on('click', function(ev){second(ev); return false;});

или
$('#testHref').on('click', second);
...
function second() {
   ...
   return false;
}

рони 16.04.2015 19:06

igorz,
попробуйте назначать клик, а не истязать атрибуты.

laimas 16.04.2015 19:09

И $(document).ready(function () внутри функции это излишек.

igorz 16.04.2015 20:03

Цитата:

Сообщение от laimas (Сообщение 367048)
И $(document).ready(function () внутри функции это излишек.

Да, возможно. Но поставил скорее "на всякий случай".

Цитата:

Сообщение от nikita.mmf (Сообщение 367043)
$('#testHref').on('click', second);
...
function second() {
   ...
   return false;
}

Спасибо. Оно работает. Только пришлось ещё дополнительно убрать первую привязку, которая остаётся висеть на онклике.

Но всё-же не до конца понимаю.
На хабре нашёл что пишут вот так:

Получается что это, как там же написано, приватная область видимости, к которой я не могу добраться из внешней.
А что тогда происходит при вашем
$('#testHref').on('click', second);

что оно всё-же видится из внешней области ?

Ещё там-же (в той статье) в конце пишут про "пространство имён" с применением private и public методов. Такой подход применяется ? Стоит ли на него обратить внимание ?
var Module = (function () {
    var myModule = {};

    var _privateMethod = function () {
        console.log("privateMethod message");
        $(document).ready(function () {
            $('#testHref').attr('onclick', 'Module.newOnClick(); return false;');
        });
    };

    myModule.publicMethod = function () {
        console.log("publicMethod message");
        _privateMethod();
    };

    myModule.newOnClick = function () {
        console.log("myModule.newOnClick");
        $('#div-body').html('New Text Here');
    };

    return myModule; // returns the Object with public methods
})();

Module.publicMethod();

рони 16.04.2015 20:13

igorz,
за строку 7 автора пиф-паф :)

igorz 16.04.2015 20:15

Собирал в кучу из разных примеров которые попадались. Всё так плохо ? :(


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