Запустите функцию внутри функции - PullRequest
0 голосов
/ 13 января 2012

У меня есть это:

function cool(){
   function alsocool(){

   }
}

И я запускаю cool () при нажатии кнопки:

$(selector).on('click', function(){
 cool();
}

Как мне запустить cool() и alsocool() от того же клика? Обратите внимание, что я не хочу сделать:

function cool(){
   function alsocool(){

   }
   alsocool();
}

Если я сделаю:

$(selector).on('click', function(){
     cool(); alsocool();
    }

это не такне работает.

Возможно ли запустить функцию внутри функции по одному и тому же вызову?

РЕДАКТИРОВАТЬ:

Я ДЕЛАЮХОЧУ передать cool(), поскольку очевидно, что alsocool() не распознается, как только его внутренняя функция cool() НО cool(); передается от многих селекторов, поэтому я хочу знать, какой селектор передается, и предпринять соответствующее действие.

Пример Я хочу что-то вроде этого:

function cool(){

// If this was called by button1, run alsocool() else bypass it
       function alsocool(){

       }
// some code goes here

}

$("#button1").on('click', function(){
         cool(); alsocool();
         // If button1 clicked, run cool AND alsocool
        }
$("#button2").on('click', function(){
         cool(); // If button2 clicked, run cool ONLY.
    }

Ответы [ 5 ]

2 голосов
/ 13 января 2012

Если вы делаете

function cool() {
   function alsocool() { ... }
}

Тогда «alsocool» существует только во время выполнения функции cool (). Он не будет доступен извне.

Вы бы хотели:

function cool() { ... }
function alsocool() { ... }

$(selector).click(function() {
   cool();
   alsocool();
}):
2 голосов
/ 13 января 2012

Ответ прост: Невозможно.
Внутренняя функция является локальной для области действия содержащей ее функции, поэтому, если эта функция не вызывает ее, она вообще не может быть вызвана.

Если вы хотите, чтобы обе функции были доступны извне, определите alsocool снаружи cool, то есть на том же уровне, что и cool.


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

function cool(callInner){
    function alsocool(){

    }
    if(callInner) {
        alsocool();
    }
}
1 голос
/ 13 января 2012

Я не понимаю, почему вы хотите это сделать, но вы можете сделать это:

function cool()
{
    arguments.callee.alsoCool = function() {
        alert("also cool");
    };

    alert("cool");
}

$("#b").click(function() {
    cool();
    cool.alsoCool();
});

Живая демоверсия: http://jsfiddle.net/ENqsZ/

В качестве альтернативы, как предложил Ракета,можно сделать это:

function cool()
{
    alert("cool");

    return function() {
        alert("also cool");
    };
}

$("#b").click(function() {
    var alsoCool = cool();

    alsoCool();
});
1 голос
/ 13 января 2012

Вы не можете этого сделать. alsocool существует только внутри cool, обработчик кликов не знает, alsocool существует.

Если вы не хотите звонить alsocool изнутри cool, тогда вам придется сделать alsocool глобальным.

1 голос
/ 13 января 2012

Проблема в том, что, поскольку вы определили функцию alsocool в cool, ее видимость ограничена этой областью.

Из-за этого вы можете только вызывать функцию alsocool из cool.

Конечно, вы можете переместить объявление alsocool за пределы cool, и это все еще позволит вам позвонить на alsocool из cool, но вы потеряет доступ к области действия cool из alsocool.

Вы также можете ограничить вызов alsocool внутри cool в зависимости от переданного параметра, если это приемлемая опция для вас;

function cool(alsoAlsoCool){
   function alsocool(){

   }

   if (alsoAlsoCool) {
       alsocool();
   }
}

// cool(true) will call it, but cool() or cool(false) won't.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...