JavaScript Запуск функции под другой функцией - PullRequest
2 голосов
/ 28 октября 2009

У меня есть 3 функции, третья функция под первой, которую я хочу запустить во второй.

function first () {
    function third () {
    }
}

function second () {
    third ();
}

Как правильно сделать второй запуск третьим?

Спасибо.

Ответы [ 6 ]

4 голосов
/ 28 октября 2009

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

Существуют различные способы сделать это, один из которых приходит на ум, это ...

Edit: я назвал параметры немного лучше, так что это не "param" снова и снова.

function first()
{
    // define first's private
    var third = function(third_param)
    {
        alert(third_param);
    }

    // define first's public that calls the private
    this.callThird = function (call_third_param)
    {
        third(call_third_param);
    }

}

function second ()
{
    // get an instance of first
    var temp = new first();

    // call the public method on it
    temp.callThird('argument');
}

Если вам не важно, чтобы третьи были частными, вы можете сделать

function first() { }

// public method
first.prototype.third = function(third_param)
{
    alert(third_param);
}


function second ()
{
    // get an instance of first
    var temp = new first();

    // call the public method on it
    temp.third('argument');
}

или, таким образом, это также не использует рядовых

function first()
{
    // the "this", makes it public
    this.third = function(third_param)
    {
        alert(third_param);
    }

}

function second ()
{
    // get an instance of first
    var temp = new first();

    // call the public method on it
    temp.third('argument');
}

Если вы пытаетесь просто сделать что-то в пространстве имен, вы можете сделать это (также нет рядовых)

// define an object and name it first
var first =
{
    // give first a public variable but make it a function with an arg
    third : function(third_param)
    {
        alert(third_param);
    }

}

function second ()
{
    // call the third method on the first variable
    first.third('argument');
}

Но, вероятно, лучший способ - через пространство имен

var first = (function () {
    // define first's private function, store it in 'third', a private variable
    var third = function (third_param) {
        alert(third_param);
    };

    // return this object to the 'first' variable
    return { // define first's public that calls the private
        'callThird': function (call_third_param) {
            third(call_third_param);
        }
    };
} ());  // this line runs the function, closure'ing over the privates and 
// returning an object (that has access to the privates) to the 'first' variable

function second () {
    // usage:
    first.callThird("Hello World!");
}
0 голосов
/ 29 октября 2009

Оставляя в стороне все "зачем вам это делать?" вопросы и предполагается, что вам нужно сделать это по уважительной причине, например, для доступа к «частной» функции внутри существующего кода, который вам не принадлежит, вот хак :

first.toString() даст вам полный источник функции. Вы можете добавить немного кода в эту функцию, чтобы получить ссылку на третью функцию:

var prober = new Function(
    first.toString().replace("{", "{ return third;") + "return first()");
var third = prober();
third(); // yay!

Но, пожалуйста не делайте этого , если вам действительно не нужно. Это большой хак, который я просто хотел упомянуть в образовательных целях.

0 голосов
/ 29 октября 2009

Сделайте первый возврат третьим. Это предложение имеет больше смысла, если ваш пример выглядит примерно так:

function first(foo) {  // notice that foo is local to first
  function third() {
    // do something with foo in the outer scope
  }
  return third;
}

function second(bar) {
  bar(); // call whatever gets passed in
}

second(first());  // third (created inside first) gets passed to second

Если у вас нет переменных, которые являются локальными по отношению к первому (в отличие от моего примера, где я использовал foo), нет смысла не определять третье место в глобальном пространстве имен, т. Е. Вы должны сделать это вместо этого:

function first() {
}

function second() {
  third();
}

function third() {
}
0 голосов
/ 28 октября 2009

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

var thirdf = function third () {
}

function first () {
  thirdf();
}

function second () {
  thirdf();
}
0 голосов
/ 28 октября 2009

Почему бы вам не сделать third () функцией, не вложенной в first (), а затем просто вызывать first () и second () для вызова third ()?

, например

function first(){
   third();
}

function second(){
   third();
}

function third(){

}
0 голосов
/ 28 октября 2009

Javascript не может легко это позволить, зачем вам это нужно делать в первую очередь, вы можете использовать объекты или прототипы для достижения этой цели.

function first(){
   third();
}

function second(){

}

function third(){
  second();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...